while sikli
Kompyuterning eng kuchli tomoni — bir xil ishni charchamasdan million marta takrorlay olishi. Bu darsda algoritmning uchinchi «g'ishti» — takrorlash bilan tanishamiz.
Bu darsda
- Sikl nima va u nima uchun kerak
whilesikli qanday ishlaydi- Hisoblagich va yig'uvchi o'zgaruvchilar
- Cheksiz sikllar va ulardan qochish
breakvacontinue
Nega sikl kerak?
Tasavvur qiling, ekranga 1 dan 5 gacha sonlarni chiqarish kerak. Buni shunday qilish mumkin:
print(1) print(2) print(3) print(4) print(5)
Lekin 1 dan 1000 gacha bo'lsa-chi? Ming qator yozasizmi? Albatta yo'q. Buning uchun sikl (inglizcha loop) bor — kodning bir qismini ko'p marta takrorlaydigan tuzilma.
while — «...ekan, takrorla»
while (inglizcha «...ekan», «...gan paytda») sikli shart rost bo'lib turgan ekan, o'z blokini qayta-qayta bajaradi. Yozilishi if ga juda o'xshaydi:
i = 1
while i <= 5:
print(i)
i = i + 1
print("Tugadi!")
1 2 3 4 5 Tugadi!
Python bu kodni shunday bajaradi:
- Shartni tekshiradi:
i <= 5? - Agar rost bo'lsa — blokni bajaradi (sonni chiqaradi va
ini 1 ga oshiradi), keyin yana 1-qadamga qaytadi. - Agar yolg'on bo'lsa — sikldan chiqadi va blokdan keyingi kodga o'tadi.
Siklning bir marta aylanishi iteratsiya deyiladi. Har bir iteratsiyani jadvalda kuzatib chiqaylik:
| Iteratsiya | i qiymati | i <= 5? | Ekranga |
|---|---|---|---|
| 1 | 1 | True | 1 |
| 2 | 2 | True | 2 |
| 3 | 3 | True | 3 |
| 4 | 4 | True | 4 |
| 5 | 5 | True | 5 |
| — | 6 | False | sikl tugaydi |
Kod tushunarsiz bo'lsa, shunday jadvalni qog'ozda chizing. Bu usul tajribali dasturchilar ham foydalanadigan eng ishonchli xato qidirish usullaridan biri.
Endi 5 ni 1000 ga almashtirib ko'ring — atigi bitta raqamni o'zgartirib, ming qator natija olasiz!
Cheksiz sikl
Agar sikl ichida shartga ta'sir qiladigan narsa o'zgarmasa, shart hech qachon yolg'on bo'lmaydi va sikl abadiy davom etadi:
i = 1
while i <= 5:
print(i)
# i = i + 1 qatorini unutdik!
Bu kodda i doim 1 bo'lib qoladi va dastur to'xtovsiz «1» chiqaraveradi. Bu saytdagi muharrir bunday dasturni o'zi to'xtatadi. Kompyuterdagi Python'da esa cheksiz siklni Ctrl + C tugmalari bilan to'xtatasiz.
Har bir while sikli yozganingizda o'zingizdan so'rang: «Sikl ichidagi qaysi narsa shartni oxir-oqibat False ga aylantiradi?»
Yig'indini hisoblash
Sikllar ko'pincha biror narsani yig'ish uchun ishlatiladi. Buning uchun sikldan oldin qiymati 0 bo'lgan «yig'uvchi» o'zgaruvchi yaratiladi:
yigindi = 0
i = 1
while i <= 100:
yigindi += i
i += 1
print("1 dan 100 gacha sonlar yig'indisi:", yigindi)
1 dan 100 gacha sonlar yig'indisi: 5050
Rivoyat qilishlaricha, mashhur matematik Karl Gauss boshlang'ich sinfda o'qiganida o'qituvchi bolalarni band qilish uchun 1 dan 100 gacha sonlarni qo'shishni buyurgan. Kichkina Gauss bir necha daqiqada javob bergan: 5050. U sonlarni juft-juft qilib qo'shgan: 1 + 100, 2 + 99, 3 + 98... — har biri 101, juftliklar esa 50 ta. Kompyuter esa shunchaki 100 marta qo'shib chiqadi — unga baribir.
Teskari sanash
Hisoblagich kamayib borishi ham mumkin:
soniya = 5
while soniya > 0:
print(soniya, "...")
soniya -= 1
print("Start!")
Foydalanuvchi to'g'ri javob berguncha
while ning eng foydali qo'llanishlaridan biri — nechta takrorlash kerakligi oldindan noma'lum bo'lganda. Masalan, foydalanuvchi to'g'ri parol kiritguncha so'rab turish:
parol = ""
while parol != "python":
parol = input("Parolni kiriting: ")
print("Kirish ruxsat etildi!")
Parolni kiriting: salom Parolni kiriting: parol Parolni kiriting: python Kirish ruxsat etildi!
Sikldan oldin parol = "" deb yozdik, aks holda birinchi tekshiruvda parol o'zgaruvchisi hali mavjud bo'lmasdi.
break — sikldan darhol chiqish
break (inglizcha «uzish») buyrug'i siklni shart qanday bo'lishidan qat'i nazar darhol to'xtatadi. Ko'pincha u while True — «doimo takrorla» bilan birga ishlatiladi:
jami = 0
while True:
son = int(input("Son kiriting (tugatish uchun 0): "))
if son == 0:
break
jami += son
print("Jami:", jami)
Son kiriting (tugatish uchun 0): 12 Son kiriting (tugatish uchun 0): 8 Son kiriting (tugatish uchun 0): 0 Jami: 20
while True o'z-o'zidan cheksiz sikl, lekin ichidagi break unga chiqish yo'lini beradi.
continue — keyingi iteratsiyaga o'tish
continue («davom et») joriy iteratsiyaning qolgan qismini tashlab, darhol keyingisiga o'tadi:
i = 0
while i < 10:
i += 1
if i % 3 == 0:
continue # 3 ga bo'linadigan sonlarni tashlab o'tamiz
print(i, end=" ")
1 2 4 5 7 8 10
continue bilan ishlaganda hisoblagichni continue dan oldin oshiring. Aks holda hisoblagich o'zgarmay qolib, cheksiz sikl hosil bo'lishi mumkin.
Amaliy misol: raqamlar soni
Sonni 10 ga butun bo'lib borsak, har safar oxirgi raqami «tushib qoladi». Shu usulda sonning nechta raqamdan iboratligini sanaymiz:
son = 2026
raqamlar = 0
while son > 0:
son = son // 10
raqamlar += 1
print("Raqamlar soni:", raqamlar)
Mashqlar
1-mashq Juft sonlar
while yordamida 2 dan 20 gacha bo'lgan juft sonlarni har birini alohida qatorda chiqaring.
i = 2
Yechimni ko'rish
i = 2
while i <= 20:
print(i)
i += 2
2-mashq Faktorial
Sonning faktoriali — 1 dan shu songacha bo'lgan barcha sonlar ko'paytmasi. Masalan, 4! = 1 × 2 × 3 × 4 = 24. n = 6 ning faktorialini hisoblang.
n = 6
Ishora
Yig'indi uchun 0 dan boshlaganimizdek, ko'paytma uchun 1 dan boshlang: natija = 1. Keyin har iteratsiyada natija *= i.
Yechimni ko'rish
n = 6
natija = 1
i = 1
while i <= n:
natija *= i
i += 1
print(natija)
3-mashq Raqamlar yig'indisi
son ning barcha raqamlari yig'indisini toping: 98765 uchun 9 + 8 + 7 + 6 + 5 = 35. Son istalgan uzunlikda bo'lishi mumkin.
son = 98765
Ishora
Oxirgi raqam — son % 10. Uni yig'indiga qo'shgach, son = son // 10 bilan uni olib tashlang. Son 0 bo'lguncha takrorlang.
Yechimni ko'rish
son = 98765
yigindi = 0
while son > 0:
yigindi += son % 10
son //= 10
print(yigindi)
4-mashq Omonat ikki baravar bo'lguncha
Omonat 1 000 000 so'm, har yili 20 foizga oshadi. Necha yildan keyin u birinchi marta 2 000 000 so'mdan oshadi? Faqat yillar sonini chiqaring.
omonat = 1000000 yillar = 0
Yechimni ko'rish
omonat = 1000000
yillar = 0
while omonat <= 2000000:
omonat *= 1.2
yillar += 1
print(yillar)
Bu yerda nechta iteratsiya bo'lishini oldindan bilmaymiz — aynan shunday holatlar uchun while ideal.
5-mashq Uch urinish
Parolni so'raydigan dastur yozing. Foydalanuvchiga 3 ta urinish berilsin. To'g'ri parol (python) kiritilsa — Xush kelibsiz!, 3 urinish tugasa — Hisob bloklandi. deb chiqsin.
# Kodingizni shu yerga yozing
Yechimni ko'rish
urinish = 0
while urinish < 3:
parol = input("Parol: ")
urinish += 1
if parol == "python":
print("Xush kelibsiz!")
break
print(f"Noto'g'ri. Qolgan urinishlar: {3 - urinish}")
if parol != "python":
print("Hisob bloklandi.")
Parol: abc Noto'g'ri. Qolgan urinishlar: 2 Parol: 123 Noto'g'ri. Qolgan urinishlar: 1 Parol: python Xush kelibsiz!
O'zingizni sinang
Quyidagi sikl necha marta «Salom» chiqaradi?
i = 0
while i < 3:
print("Salom")
i += 1
- 2
- 4
- 3
- Cheksiz
To'g'ri. i 0, 1, 2 qiymatlarida shart rost; 3 bo'lganda sikl tugaydi.
Sikldan shartni kutmasdan darhol chiqish uchun qaysi buyruq ishlatiladi?
continuebreakexitstop
To'g'ri. continue esa faqat joriy iteratsiyani tashlab o'tadi.
Quyidagi kodda nima muammo bor?
n = 10
while n > 0:
print(n)
- Ikki nuqta yetishmaydi
- Hech narsa chiqmaydi
- Faqat bir marta ishlaydi
- Cheksiz sikl:
nhech qachon kamaymaydi
To'g'ri. Sikl ichiga n -= 1 qo'shish kerak.
Sonlar yig'indisini hisoblashda yig'uvchi o'zgaruvchi odatda qaysi qiymatdan boshlanadi?
01None""
To'g'ri. Yig'indi uchun 0, ko'paytma uchun esa 1 dan boshlanadi.
Xulosa
while shart:— shart rost ekan, blokni takrorlaydi.- Sikl ichida shartga ta'sir qiladigan narsa o'zgarishi kerak, aks holda cheksiz sikl hosil bo'ladi.
- Yig'indi uchun sikldan oldin
yigindi = 0, ko'paytma uchunnatija = 1yoziladi. break— sikldan darhol chiqadi,continue— keyingi iteratsiyaga o'tadi.whiletakrorlashlar soni oldindan noma'lum bo'lganda ayniqsa qulay.