while sikli
Bu bobda
- shart rost bo'lguncha takrorlashni:
while - cheksiz sikldan qochishni (va unga tushib qolsangiz, to'xtatishni)
- bayroq (flag),
while True+break,continueandozalarini - 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: "foydalanuvchiqyozguncha", "hisob 1 000 000 dan oshguncha".
son = 1 while son <= 5: print(son) son += 1
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:
- Sikldan oldin o'zgaruvchini tayyorlash:
son = 1. - Shart:
son <= 5. - Sikl ichida o'zgaruvchini o'zgartirish:
son += 1.
Cheksiz sikl
Uchinchi qadamni unutsangiz, shart hech qachon yolg'on bo'lmaydi:
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:
xabar = "" while xabar != "quit": xabar = input("Biror narsa yozing ('quit' - chiqish): ") if xabar != "quit": print("Siz yozdingiz:", xabar)
Biror narsa yozing ('quit' - chiqish): Salom
Siz yozdingiz: Salom
Biror narsa yozing ('quit' - chiqish): Qalaysan
Siz yozdingiz: Qalaysan
Biror narsa yozing ('quit' - chiqish): quitxabar = "" — 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:
faol = True while faol: meva = input("Meva nomi: ") if meva == "quit": faol = False else: print(f"{meva.capitalize()} savatga qo'shildi")
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.
while True: shahar = input("Qaysi shaharga bormoqchisiz? ('q' - chiqish): ") if shahar == "q": break print(f"{shahar} — ajoyib tanlov!") print("Xayr!")
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":
son = 0 while son < 10: son += 1 if son % 2 == 0: continue print(son, end=" ")
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:
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)
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:
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")
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:
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")
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:
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)
Raqamlar soni: 5 Raqamlar yig'indisi: 19
Har bir qadamni kuzatish uchun n ni chiqarib ko'ramiz:
n = 70426 while n > 0: print(f"n = {n:5} oxirgi raqam = {n % 10}") n //= 10
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:
n = 12345 teskari = 0 while n > 0: teskari = teskari * 10 + n % 10 n //= 10 print(teskari)
54321
Loyiha: sonni top o'yini
Kompyuter 1 dan 100 gacha son o'ylaydi, foydalanuvchi topishga harakat qiladi:
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
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:
hisob = 10_000_000 oy = 0 while hisob <= 15_000_000: hisob *= 1.02 oy += 1 print(f"{oy} oyda: {hisob:,.0f} so'm")
21 oyda: 15,156,663 so'm
Kitoblarda
- Python asoslari:
whilesikli 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 Truemisollari 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.continuedan oldin hisoblagichni oshiring.while ... else—elsefaqatbreaksiz tugaganda ishlaydi.n % 10van //= 10— raqamlarni birma-bir olish.
Mashqlar
Bu mashqlarda takrorlashlar soni oldindan noma'lum, shuning uchun while ishlating.
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.
| Kirish | Kutilgan natija |
|---|---|
| 17, 5 | 3 2 |
| 20, 4 | 5 0 |
| 3, 7 | 0 3 |
Yechimni ko'rish
n = int(input()) k = int(input()) butun = 0 while n >= k: n -= k butun += 1 print(butun, n)
Musbat butun son N berilgan. Kvadrati N dan katta bo'lgan eng kichik butun musbat K ni toping: K² > N.
| Kirish | Kutilgan natija |
|---|---|
| 10 | 4 |
| 16 | 5 |
| 1 | 2 |
Yechimni ko'rish
n = int(input()) k = 1 while k * k <= n: k += 1 print(k)
Musbat butun son N berilgan. Kvadrati N dan katta bo'lmagan eng katta butun K ni toping: K² ≤ N.
| Kirish | Kutilgan natija |
|---|---|
| 10 | 3 |
| 16 | 4 |
| 1 | 1 |
Yechimni ko'rish
n = int(input()) k = 1 while (k + 1) * (k + 1) <= n: k += 1 print(k)
Butun son N berilgan (N > 1). 1 + 2 + ... + K ≥ N bo'ladigan eng kichik K ni toping. K ni va shu yig'indini chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 10 | 4 10 |
| 11 | 5 15 |
| 2 | 2 3 |
Yechimni ko'rish
n = int(input()) k = 0 s = 0 while s < n: k += 1 s += k print(k, s)
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.
| Kirish | Kutilgan natija |
|---|---|
| 5 | 2 1102.5 |
| 10 | 2 1210 |
| 1 | 10 1104.6221254112045 |
Yechimni ko'rish
p = float(input()) s = 1000 k = 0 while s <= 1100: s *= 1 + p / 100 k += 1 print(k, s)
Musbat butun son N berilgan. // va % yordamida uning raqamlarini o'ngdan boshlab (birlar xonasidan) bittadan chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 1234 | 4 3 2 1 |
| 7 | 7 |
| 100 | 0 0 1 |
Yechimni ko'rish
n = int(input()) while n > 0: print(n % 10, end=" ") n //= 10
Musbat butun son N berilgan. Uning raqamlari soni va raqamlari yig'indisini chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 1234 | 4 10 |
| 7 | 1 7 |
| 90009 | 5 18 |
Yechimni ko'rish
n = int(input()) soni = 0 s = 0 while n > 0: s += n % 10 soni += 1 n //= 10 print(soni, s)
Musbat butun son N berilgan. Raqamlarini teskari tartibda yozib hosil bo'lgan sonni chiqaring.
| Kirish | Kutilgan natija |
|---|---|
| 1234 | 4321 |
| 7 | 7 |
| 1200 | 21 |
Yechimni ko'rish
n = int(input()) t = 0 while n > 0: t = t * 10 + n % 10 n //= 10 print(t)
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.
| Kirish | Kutilgan natija |
|---|---|
| 7 | True |
| 12 | False |
| 97 | True |
Yechimni ko'rish
n = int(input()) d = 2 tub = True while d * d <= n: if n % d == 0: tub = False break d += 1 print(tub)
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.
| Kirish | Kutilgan natija |
|---|---|
| 48, 36 | 12 |
| 17, 5 | 1 |
| 100, 75 | 25 |
Yechimni ko'rish
a = int(input()) b = int(input()) while b != 0: a, b = b, a % b print(a)
Foydalanuvchi sonlarni birma-bir kiritadi, 0 kiritilganda to'xtaydi. Kiritilgan sonlar yig'indisini chiqaring (0 hisobga kirmaydi).
| Kirish | Kutilgan natija |
|---|---|
| 5, 3, 10, 0 | 18 |
| 0 | 0 |
| -4, 4, 7, 0 | 7 |
Yechimni ko'rish
s = 0 while True: x = int(input()) if x == 0: break s += x print(s)
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.
| Kirish | Kutilgan natija |
|---|---|
| 6 | 8 |
| 1 | 0 |
| 27 | 111 |
Yechimni ko'rish
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.