Гузариш ба мундариҷа
Мавзӯи 5 аз 18

Давраи for ва range

Тасаввур кун, ки ададҳоро аз 1 то 1000 чоп кардан ё 500 ададро аз маълумоти вуруд ҷамъ кардан лозим аст. Ҳеҷ кас 1000 сатр код наменависад — барои такрори амалҳо давраҳо (циклҳо) ҳастанд.

Давраи for

for i in range(5):
    print("Қадам", i)

Хуруҷ:

Қадам 0
Қадам 1
Қадам 2
Қадам 3
Қадам 4

Ин чӣ тавр кор мекунад: тағйирёбандаи i навбат ба навбат ҳар қиматро аз range(5) мегирад, ва барои ҳар қимат ҷисми давра — сатрҳои бо отступ зери for — иҷро мешавад. Як иҷрои ҷисмро итератсия меноманд.

range — пайдарпайии ададҳо

Навишт Ададҳо
range(5) 0, 1, 2, 3, 4
range(2, 6) 2, 3, 4, 5
range(1, 10, 3) 1, 4, 7
range(5, 0, -1) 5, 4, 3, 2, 1

Қоидаи асосӣ: сарҳади рост дохил намешавад. range(a, b) аз a то b - 1 меравад. Мехоҳӣ b-ро дохил кунӣ — range(a, b + 1) навис.

Параметри сеюм — қадам. Қадами манфӣ ба поён меравад.

Ҷамъоварӣ: сумма

Барои дар давра ҳисоб кардани чизе тағйирёбандаро пеш аз давра месозанд ва дар дохил тағйир медиҳанд:

total = 0
for x in range(1, 6):
    total = total + x
print(total)    # 15 = 1 + 2 + 3 + 4 + 5

Навишти total = total + x-ро кӯтоҳ кардан мумкин аст: total += x. Ҳамин тавр -=, *=, //= кор мекунанд.

Мисол: ҳосили зарби ададҳо аз 1 то 5 (факториал):

p = 1             # барои ҳосили зарб аз 1 сар мекунем, на аз 0!
for x in range(1, 6):
    p *= x
print(p)          # 120

Ҳисобкунак

Аз 1 то 100 чанд адад ба 7 тақсим мешавад?

count = 0
for x in range(1, 101):
    if x % 7 == 0:
        count += 1
print(count)      # 14

Дар дохили давра ҳама чизеро, ки аллакай медонӣ, истифода бурдан мумкин аст: шартҳо, арифметика, print.

Хондани n адад

Формати маъмули вуруд: дар сатри аввал n, баъд n сатр, ки дар ҳар кадом як адад. Давра маҳз барои хондани ҳамаи онҳо лозим аст:

n = int(input())
total = 0
for _ in range(n):
    x = int(input())
    total += x
print(total)

Агар тағйирёбандаи давра лозим набошад, онро аксар вақт _ меноманд.

Ҳар input() дар дохили давра сатри навбатиро мехонад — дар n итератсия мо маҳз n ададро мехонем.

Минимум ва максимум «дастӣ»

Чӣ тавр хурдтаринро аз ададҳое, ки якто-якто меоянд, ёфтан мумкин аст? «Беҳтарини ҳозира»-ро нигоҳ медорем ва бо ҳар адади нав муқоиса мекунем:

n = int(input())
smallest = int(input())       # адади аввал — ҳоло хурдтарин
for _ in range(n - 1):
    x = int(input())
    if x < smallest:
        smallest = x
print(smallest)

Диққат деҳ, ки аз чӣ сар кардем: аз адади аввали вуруд, на аз ягон қимати «қулай» мисли 0. Фикр кун, агар ҳамаи ададҳо аз сифр калон мебуданд ва мо аз smallest = 0 сар мекардем, чӣ нодуруст мешуд.

Чоп дар як сатр

Бо пешфарз print ба сатри нав мегузарад. Барои дар давра бо фосила чоп кардан end-ро истифода бар:

for i in range(1, 6):
    print(i * 10, end=" ")
print()     # дар охир ба сатри нав гузаштан

Хуруҷ: 10 20 30 40 50 . Фосилаи зиёдатӣ дар охир одатан халал намерасонад, агар дар масъала ададҳо муқоиса шаванд, на тамоми матн.

Ин чӣ қадар вақт мегирад

Амали оддӣ дар давра зуд иҷро мешавад, вале на фаврӣ. Давраи 105–106 итератсия ба як сония меғунҷад, 109 бошад — не. Ба маҳдудиятҳои шарт нигар: онҳо ишора мекунанд, ки кадом ҳал ба вақт мерасад.

Хулоса

  • for i in range(...) ҷисми давраро барои ҳар қимат такрор мекунад;
  • range(a, b) b-ро дохил намекунад; параметри сеюм — қадам;
  • ҷамъкунандаҳо (сумма, ҳисобкунак, ҳосили зарб) пеш аз давра сохта мешаванд;
  • барои хондани n адад input()-ро дар давра даъват кун;
  • барои минимум ва максимум аз қимати аввали хондашуда сар кун.