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
  • while sikli qanday ishlaydi
  • Hisoblagich va yig'uvchi o'zgaruvchilar
  • Cheksiz sikllar va ulardan qochish
  • break va continue

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:

  1. Shartni tekshiradi: i <= 5?
  2. Agar rost bo'lsa — blokni bajaradi (sonni chiqaradi va i ni 1 ga oshiradi), keyin yana 1-qadamga qaytadi.
  3. 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:

Iteratsiyai qiymatii <= 5?Ekranga
11True1
22True2
33True3
44True4
55True5
—6Falsesikl 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
  1. 2
  2. 4
  3. 3
  4. 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?

  1. continue
  2. break
  3. exit
  4. stop

To'g'ri. continue esa faqat joriy iteratsiyani tashlab o'tadi.

Quyidagi kodda nima muammo bor?

n = 10
while n > 0:
    print(n)
  1. Ikki nuqta yetishmaydi
  2. Hech narsa chiqmaydi
  3. Faqat bir marta ishlaydi
  4. Cheksiz sikl: n hech qachon kamaymaydi

To'g'ri. Sikl ichiga n -= 1 qo'shish kerak.

Sonlar yig'indisini hisoblashda yig'uvchi o'zgaruvchi odatda qaysi qiymatdan boshlanadi?

  1. 0
  2. 1
  3. None
  4. ""

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 uchun natija = 1 yoziladi.
  • break — sikldan darhol chiqadi, continue — keyingi iteratsiyaga o'tadi.
  • while takrorlashlar soni oldindan noma'lum bo'lganda ayniqsa qulay.