Давраи while
Давраи for хуб аст, вақте пешакӣ маълум аст, ки чанд бор такрор кардан лозим. Вале дигар хел ҳам мешавад: «ададро ба 10 тақсим кун, то даме ки дар он рақам ҳаст», «ададҳоро хон, то даме ки сифр пайдо шавад». Барои чунин ҳолатҳо давраи while ҳаст.
while чӣ тавр кор мекунад
n = 1
while n <= 100:
n = n * 2
print(n) # 128
- Шарти
n <= 100санҷида мешавад. - Агар он дуруст бошад — ҷисми давра иҷро мешавад, ва ҳама чиз аз қадами 1 такрор мешавад.
- Агар нодуруст бошад — давра тамом мешавад, барнома пеш меравад.
Дар ин ҷо n қиматҳои 1, 2, 4, …, 64, 128-ро мегузарад — дар 128 шарт нодуруст мешавад.
Давраи беохир — хатари асосӣ
Агар дар ҷисми давра ҳеҷ чиз шартро тағйир надиҳад, давра ҳеҷ гоҳ тамом намешавад:
k = 5
while k > 0:
print(k) # k тағйир намеёбад — барнома овезон мешавад
Ҳангоми санҷиши чунин код система TLE — «вақт аз ҳад гузашт» медиҳад. Ҳамеша аз худ пурс: чӣ дар дохили давра онро ба охир наздик мекунад?
Адад рақам ба рақам
Ба ёд ор: n % 10 — рақами охирин, n // 10 — адад бе он. Дар давра рақамҳоро якто-якто «газидан» мумкин аст, то адад сифр шавад. Масалан, ҳисоб мекунем, ки дар адад чанд рақам ҳаст:
n = int(input()) # масалан, 40517
digits = 0
while n > 0:
n //= 10
digits += 1
print(digits) # 5
Фикр кун, ки ин код барои n = 0 чӣ мебарорад ва агар дар масъала ин мумкин бошад, онро чӣ тавр ислоҳ кардан мумкин аст.
Ҳамин тавр рақами охиринеро, ки аз 5 калон аст, ёфтан ё санҷидан мумкин аст, ки дар адад ҳафт ҳаст ё не — ҳамон давра, кори дигар дар дохил.
Хондан то охири маълумот
Баъзан шумораи ададҳо дода нашудааст, ва охири маълумот бо қимати махсус, масалан сифр, ишора шудааст:
x = int(input())
total = 0
while x != 0:
total += x
x = int(input()) # навбатиро дар охири ҷисм мехонем
print(total)
Ба нақша диққат деҳ: адади аввал пеш аз давра хонда мешавад, навбатӣ — дар охири ҷисм. Ҳамин тавр сифр-нишона ҳеҷ гоҳ ба коркард намеафтад.
break — баромадан аз давра
break давраро фавран тамом мекунад (ҳам while, ҳам for):
n = int(input())
d = 2
while d <= n:
if n % d == 0:
break # тақсимкунанда ёфтем — минбаъд ҷустан лозим нест
d += 1
print(d) # хурдтарин тақсимкунандаи аз 1 калон
continue — ба итератсияи навбатӣ
continue боқимондаи ҷисмро мегузаронад ва фавран ба қадами навбатӣ мегузарад:
for i in range(1, 11):
if i % 3 == 0:
continue
print(i, end=" ") # 1 2 4 5 7 8 10
while True
Баъзан навиштани давраи «беохир» ва баромадан аз он тавассути break, вақте ки вақташ расид, қулай аст:
while True:
word = input()
if word == "бас":
break
print("Ту ворид кардӣ:", word)
Чиро интихоб кардан: for ё while
- шумораи такрорҳо маълум аст ё
range-ро гузаштан лозим —for; - такрор кардан, «то даме ки» чизе рӯй надиҳад —
while.
Ҳар for-ро тавассути while аз нав навиштан мумкин аст, вале for кӯтоҳтар аст ва дар он тағйир додани ҳисобкунакро фаромӯш намекунӣ.
Хулоса
while шарт:ҷисмро то даме ки шарт дуруст аст, такрор мекунад;- дар дохили давра чизе бояд шартро тағйир диҳад, вагарна — давраи беохир ва TLE;
% 10ва// 10дар давра ададро ба рақамҳо ҷудо мекунанд;- нишонаи охири маълумот: қимати аввалро пеш аз давра, навбатиро — дар охири ҷисм мехонем;
breakаз давра мебарояд,continueба итератсияи навбатӣ мегузарад.