Asosiy qismga o'tish

while sikli

8-bob 26 kod bloki 2287 so'z

Bu bobda

  • shart rost bo'lguncha takrorlashni: while
  • cheksiz sikldan qochishni (va unga tushib qolsangiz, to'xtatishni)
  • bayroq (flag), while True + break, continue andozalarini
  • foydalanuvchi to'g'ri kiritguncha qayta so'rashni
  • sonning raqamlari bilan ishlashni

for va while: farqi nima?

  • for — necha marta takrorlash oldindan ma'lum bo'lsa: "10 marta", "satrdagi har bir harf uchun".
  • while — qachon to'xtash ma'lum bo'lsa, lekin necha marta ekani noma'lum: "foydalanuvchi q yozguncha", "hisob 1 000 000 dan oshguncha".
python4 qator
son = 1
while son <= 5:
    print(son)
    son += 1
Natija
1
2
3
4
5

O'qilishi: "son ≤ 5 ekan, sonni chiqar va 1 ga oshir". Har bir aylanishdan oldin shart tekshiriladi. son 6 bo'lganda shart yolg'on bo'ladi va sikl tugaydi.

while siklining uch qismi:

  1. Sikldan oldin o'zgaruvchini tayyorlash: son = 1.
  2. Shart: son <= 5.
  3. Sikl ichida o'zgaruvchini o'zgartirish: son += 1.

Cheksiz sikl

Uchinchi qadamni unutsangiz, shart hech qachon yolg'on bo'lmaydi:

python3 qator
son = 1
while son <= 5:
    print(son)

Bu dastur 1 ni abadiy chiqaraveradi. Kitobda uni ishga tushirmadik.

Cheksiz siklga tushib qolsangiz

Jupyterda katak yonida [*] yulduzcha turaveradi. Yuqoridagi ■ (Stop) tugmasini bosing yoki Kernel → Interrupt. Terminalda — Ctrl + C.

Foydalanuvchi to'xtatguncha

input() bilan while — eng ko'p uchraydigan juftlik. Foydalanuvchi quit yozguncha aytganini qaytaradigan dastur:

python5 qator
xabar = ""
while xabar != "quit":
    xabar = input("Biror narsa yozing ('quit' - chiqish): ")
    if xabar != "quit":
        print("Siz yozdingiz:", xabar)
Natija
Biror narsa yozing ('quit' - chiqish): Salom
Siz yozdingiz: Salom
Biror narsa yozing ('quit' - chiqish): Qalaysan
Siz yozdingiz: Qalaysan
Biror narsa yozing ('quit' - chiqish): quit

xabar = "" — sikldan oldin bo'sh qiymat, aks holda birinchi tekshiruvda xabar mavjud bo'lmaydi (NameError).

Bayroq (flag)

To'xtash sababi bir nechta bo'lsa, bitta True/False o'zgaruvchi — bayroq ishlatish qulay:

python7 qator
faol = True
while faol:
    meva = input("Meva nomi: ")
    if meva == "quit":
        faol = False
    else:
        print(f"{meva.capitalize()} savatga qo'shildi")
Natija
Meva nomi: olma
Olma savatga qo'shildi
Meva nomi: anor
Anor savatga qo'shildi
Meva nomi: quit

while True va break

Eng ko'p ishlatiladigan andoza: sikl "abadiy" aylanadi, to'xtash joyini esa break belgilaydi.

python6 qator
while True:
    shahar = input("Qaysi shaharga bormoqchisiz? ('q' - chiqish): ")
    if shahar == "q":
        break
    print(f"{shahar} — ajoyib tanlov!")
print("Xayr!")
Natija
Qaysi shaharga bormoqchisiz? ('q' - chiqish): Toshkent
Toshkent — ajoyib tanlov!
Qaysi shaharga bormoqchisiz? ('q' - chiqish): Buxoro
Buxoro — ajoyib tanlov!
Qaysi shaharga bormoqchisiz? ('q' - chiqish): q
Xayr!

break siklni darhol tugatadi va dastur sikldan keyingi qatordan davom etadi.

continue

continue — "bu aylanishning qolganini tashla, keyingisiga o't":

python6 qator
son = 0
while son < 10:
    son += 1
    if son % 2 == 0:
        continue
    print(son, end=" ")
Natija
1 3 5 7 9 

Juft sonlarda continue ishladi va print ga yetib bormadi. son += 1 ni continue dan oldin yozganimizga e'tibor bering: aks holda son o'zgarmay qolib, cheksiz sikl bo'lardi.

To'g'ri kiritguncha so'rash

2-bobda int("abc") dasturni yiqitishini, 6-bobda isdigit() bilan tekshirishni ko'rdik. Endi foydalanuvchidan to'g'ri son kelguncha qayta so'raymiz:

python7 qator
while True:
    matn = input("Yoshingiz: ")
    if matn.isdigit() and 0 < int(matn) < 120:
        yosh = int(matn)
        break
    print("Iltimos, 1 dan 119 gacha son kiriting")
print("Rahmat! Yoshingiz:", yosh)
Natija
Yoshingiz: yigirma
Iltimos, 1 dan 119 gacha son kiriting
Yoshingiz: -5
Iltimos, 1 dan 119 gacha son kiriting
Yoshingiz: 25
Rahmat! Yoshingiz: 25

"-5" ham rad etildi, chunki - raqam emas: "-5".isdigit() — False.

Urinishlar soni cheklangan: PIN kod

Bankomat 3 marta noto'g'ri PIN dan keyin kartani bloklaydi:

python11 qator
PIN = "1234"
urinish = 0
while urinish < 3:
    kiritilgan = input("PIN: ")
    urinish += 1
    if kiritilgan == PIN:
        print("Xush kelibsiz!")
        break
    print(f"Noto'g'ri. Qolgan urinish: {3 - urinish}")
else:
    print("Karta bloklandi")
Natija
PIN: 1111
Noto'g'ri. Qolgan urinish: 2
PIN: 2580
Noto'g'ri. Qolgan urinish: 1
PIN: 1234
Xush kelibsiz!

Bu yerda yangi narsa bor: while ... else. else qismi faqat sikl break siz tugaganda bajariladi — ya'ni 3 marta ham xato bo'lsa. Endi uch martasi ham xato bo'lgan holat:

python11 qator
PIN = "1234"
urinish = 0
while urinish < 3:
    kiritilgan = input("PIN: ")
    urinish += 1
    if kiritilgan == PIN:
        print("Xush kelibsiz!")
        break
    print(f"Noto'g'ri. Qolgan urinish: {3 - urinish}")
else:
    print("Karta bloklandi")
Natija
PIN: 1111
Noto'g'ri. Qolgan urinish: 2
PIN: 2222
Noto'g'ri. Qolgan urinish: 1
PIN: 3333
Noto'g'ri. Qolgan urinish: 0
Karta bloklandi

Sonning raqamlari bilan ishlash

3-bobda n % 10 — oxirgi raqam, n // 10 — oxirgi raqamsiz son ekanini ko'rdik. Buni while da n 0 bo'lguncha takrorlasak, istalgan uzunlikdagi sonning hamma raqamini olamiz:

python10 qator
n = 70426
raqamlar_soni = 0
yigindi = 0
while n > 0:
    raqam = n % 10
    yigindi += raqam
    raqamlar_soni += 1
    n //= 10
print("Raqamlar soni:", raqamlar_soni)
print("Raqamlar yig'indisi:", yigindi)
Natija
Raqamlar soni: 5
Raqamlar yig'indisi: 19

Har bir qadamni kuzatish uchun n ni chiqarib ko'ramiz:

python4 qator
n = 70426
while n > 0:
    print(f"n = {n:5}   oxirgi raqam = {n % 10}")
    n //= 10
Natija
n = 70426   oxirgi raqam = 6
n =  7042   oxirgi raqam = 2
n =   704   oxirgi raqam = 4
n =    70   oxirgi raqam = 0
n =     7   oxirgi raqam = 7

Sonni teskari aylantirish ham shu usulda:

python6 qator
n = 12345
teskari = 0
while n > 0:
    teskari = teskari * 10 + n % 10
    n //= 10
print(teskari)
Natija
54321

Loyiha: sonni top o'yini

Kompyuter 1 dan 100 gacha son o'ylaydi, foydalanuvchi topishga harakat qiladi:

python16 qator
import random

random.seed(2026)
sir = random.randint(1, 100)
urinish = 0

while True:
    taxmin = int(input("Taxminingiz: "))
    urinish += 1
    if taxmin < sir:
        print("Kattaroq son")
    elif taxmin > sir:
        print("Kichikroq son")
    else:
        print(f"Topdingiz! Javob {sir}. Urinishlar: {urinish}")
        break
Natija
Taxminingiz: 50
Kichikroq son
Taxminingiz: 25
Kichikroq son
Taxminingiz: 12
Kattaroq son
Taxminingiz: 18
Kichikroq son
Taxminingiz: 15
Kattaroq son
Taxminingiz: 16
Topdingiz! Javob 16. Urinishlar: 6

Har safar o'rtadagi sonni aytsangiz (50, keyin 25 yoki 75...), 100 tagacha sonni ko'pi bilan 7 urinishda topasiz. Bu ikkilik qidiruv (binary search) deyiladi va dasturlashdagi eng muhim g'oyalardan biri.

O'zingiz o'ynab ko'rganda random.seed(2026) qatorini olib tashlang, aks holda sir son har safar bir xil bo'ladi.

Hisob o'sishi: qachon yetadi?

Bankka 10 000 000 so'm qo'ydingiz, har oy 2% foiz qo'shiladi. Necha oyda 15 000 000 dan oshadi? Oylar soni oldindan noma'lum — bu while uchun aynan mos vazifa:

python6 qator
hisob = 10_000_000
oy = 0
while hisob <= 15_000_000:
    hisob *= 1.02
    oy += 1
print(f"{oy} oyda: {hisob:,.0f} so'm")
Natija
21 oyda: 15,156,663 so'm

Kitoblarda

  • Python asoslari: while sikli 61–62-betlar.
  • Python Crash Course: 7-bob, Introducing while Loops 118–120-betlar, Using break 121-bet, Using continue 122-bet, Avoiding Infinite Loops 122-bet. Kitobdagi prompt / active / while True misollari shu bobdagi andozalar bilan bir xil.

Xulosa

  • while shart: — shart rost ekan takrorlaydi; sikl ichida shartdagi o'zgaruvchini o'zgartiring.
  • Cheksiz sikl: Jupyterda ■ Stop, terminalda Ctrl + C.
  • while True: + if ...: break — eng ko'p ishlatiladigan andoza.
  • continue dan oldin hisoblagichni oshiring.
  • while ... else — else faqat break siz tugaganda ishlaydi.
  • n % 10 va n //= 10 — raqamlarni birma-bir olish.

Mashqlar

Bu mashqlarda takrorlashlar soni oldindan noma'lum, shuning uchun while ishlating.

While3

Musbat butun sonlar N va K berilgan. Faqat qo'shish va ayirishdan foydalanib, N ni K ga bo'lgandagi butun qism va qoldiqni toping. Avval butun qismni, keyin qoldiqni chiqaring.

KirishKutilgan natija
17, 53 2
20, 45 0
3, 70 3
Yechimni ko'rish
python7 qator
n = int(input())
k = int(input())
butun = 0
while n >= k:
    n -= k
    butun += 1
print(butun, n)
While7

Musbat butun son N berilgan. Kvadrati N dan katta bo'lgan eng kichik butun musbat K ni toping: K² > N.

KirishKutilgan natija
104
165
12
Yechimni ko'rish
python5 qator
n = int(input())
k = 1
while k * k <= n:
    k += 1
print(k)
While8

Musbat butun son N berilgan. Kvadrati N dan katta bo'lmagan eng katta butun K ni toping: K² ≤ N.

KirishKutilgan natija
103
164
11
Yechimni ko'rish
python5 qator
n = int(input())
k = 1
while (k + 1) * (k + 1) <= n:
    k += 1
print(k)
While11

Butun son N berilgan (N > 1). 1 + 2 + ... + K ≥ N bo'ladigan eng kichik K ni toping. K ni va shu yig'indini chiqaring.

KirishKutilgan natija
104 10
115 15
22 3
Yechimni ko'rish
python7 qator
n = int(input())
k = 0
s = 0
while s < n:
    k += 1
    s += k
print(k, s)
While15

Bankdagi boshlang'ich omonat 1000 so'm. Har oy omonat mavjud summaning P foiziga oshadi (0 < P < 25). Necha oyda omonat 1100 so'mdan oshishini toping. Oylar soni K ni va oxirgi summa S ni chiqaring.

KirishKutilgan natija
52 1102.5
102 1210
110 1104.6221254112045
Yechimni ko'rish
python7 qator
p = float(input())
s = 1000
k = 0
while s <= 1100:
    s *= 1 + p / 100
    k += 1
print(k, s)
While17

Musbat butun son N berilgan. // va % yordamida uning raqamlarini o'ngdan boshlab (birlar xonasidan) bittadan chiqaring.

KirishKutilgan natija
12344 3 2 1
77
1000 0 1
Yechimni ko'rish
python4 qator
n = int(input())
while n > 0:
    print(n % 10, end=" ")
    n //= 10
While18

Musbat butun son N berilgan. Uning raqamlari soni va raqamlari yig'indisini chiqaring.

KirishKutilgan natija
12344 10
71 7
900095 18
Yechimni ko'rish
python8 qator
n = int(input())
soni = 0
s = 0
while n > 0:
    s += n % 10
    soni += 1
    n //= 10
print(soni, s)
While19

Musbat butun son N berilgan. Raqamlarini teskari tartibda yozib hosil bo'lgan sonni chiqaring.

KirishKutilgan natija
12344321
77
120021
Yechimni ko'rish
python6 qator
n = int(input())
t = 0
while n > 0:
    t = t * 10 + n % 10
    n //= 10
print(t)
While22

Butun son N berilgan (N > 1). U tub son bo'lsa True, aks holda False chiqaring. Tub son — faqat 1 ga va o'ziga bo'linadigan son.

KirishKutilgan natija
7True
12False
97True
Yechimni ko'rish
python9 qator
n = int(input())
d = 2
tub = True
while d * d <= n:
    if n % d == 0:
        tub = False
        break
    d += 1
print(tub)
While23

Musbat butun sonlar A va B berilgan. Ularning eng katta umumiy bo'luvchisini (EKUB) Evklid algoritmi bilan toping: B nolga teng bo'lmaguncha, A, B = B, A % B. Oxirida EKUB — A.

KirishKutilgan natija
48, 3612
17, 51
100, 7525
Yechimni ko'rish
python5 qator
a = int(input())
b = int(input())
while b != 0:
    a, b = b, a % b
print(a)
8.1

Foydalanuvchi sonlarni birma-bir kiritadi, 0 kiritilganda to'xtaydi. Kiritilgan sonlar yig'indisini chiqaring (0 hisobga kirmaydi).

KirishKutilgan natija
5, 3, 10, 018
00
-4, 4, 7, 07
Yechimni ko'rish
python7 qator
s = 0
while True:
    x = int(input())
    if x == 0:
        break
    s += x
print(s)
8.2

Kollats masalasi. Musbat butun son N berilgan. Agar u juft bo'lsa — 2 ga bo'ling, toq bo'lsa — 3·N + 1 ga almashtiring. 1 hosil bo'lguncha takrorlang. Necha qadam kerak bo'lganini chiqaring.

KirishKutilgan natija
68
10
27111
Yechimni ko'rish
python9 qator
n = int(input())
qadam = 0
while n != 1:
    if n % 2 == 0:
        n //= 2
    else:
        n = 3 * n + 1
    qadam += 1
print(qadam)

Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar