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

Давраҳои дарунӣ

Дар дохили давра ҳар чиз буда метавонад — аз ҷумла давраи дигар. Ҳамин тавр ҷуфтҳои ададҳоро мегузаронанд, ҷадвалҳо месозанд ва шаклҳо мекашанд.

Давра дар давра

for i in range(1, 4):
    for j in range(1, 3):
        print(i, j)

Хуруҷ:

1 1
1 2
2 1
2 2
3 1
3 2

Барои ҳар қимати i давраи дарунӣ ҳамаи қиматҳои j-и худро мегузарад. Соатро тасаввур кардан қулай аст: давраи берунӣ — ақрабаки соат, дарунӣ — ақрабаки дақиқа. Ақрабаки дақиқа пеш аз он ки ақрабаки соат як тақсимот ҳаракат кунад, як давраи пурра мезанад.

Ҷисми давраи дарунӣ чанд бор иҷро мешавад? 3 * 2 = 6. Дар ҳолати умумӣ — ҳосили зарби дарозиҳои давраҳо.

Сатрҳо аз аломатҳо

Масъалаи маъмул — нақшро сатр ба сатр чоп кардан. Давраи берунӣ барои сатрҳо, дарунӣ — барои аломатҳо дар сатр масъул аст:

rows, cols = 3, 5
for i in range(rows):
    for j in range(cols):
        print("o", end="")
    print()          # охири сатр
ooooo
ooooo
ooooo

Ба print() пас аз давраи дарунӣ диққат деҳ — он ба сатри нав мегузаронад. Он бо отступи давраи берунӣ меистад, на дарунӣ.

Аломат аз мавқеъ вобаста аст

Дар дохил метавон аз рӯи рақами сатр i ва сутун j қарор дод, ки чӣ чоп кардан лозим. Масалан, чорчӯба — ситорачаҳо дар канорҳо, фосилаҳо дар дохил:

n = 4
for i in range(n):
    for j in range(n):
        if i == 0 or i == n - 1 or j == 0 or j == n - 1:
            print("*", end="")
        else:
            print(" ", end="")
    print()
****
*  *
*  *
****

Диагональ бошад — хонаҳое, ки дар онҳо i == j. Кӯшиш кун худат квадратро бо диагональ кашӣ.

Давраи дарунӣ аз берунӣ вобаста аст

Сарҳадҳои давраи дарунӣ метавонанд аз тағйирёбандаи давраи берунӣ вобаста бошанд:

for i in range(1, 5):
    for j in range(i):
        print(i, end="")
    print()
1
22
333
4444

Ҳамин тавр ҷуфтҳоро бе такрор мегузаронанд: for i in range(n) ва for j in range(i + 1, n) — ҳар ҷуфти (i, j) бо i < j маҳз як бор вомехӯрад.

n = 4
pairs = 0
for i in range(1, n + 1):
    for j in range(i + 1, n + 1):
        pairs += 1
print(pairs)    # 6 ҷуфт аз 4 адад

Ҷустуҷӯ бо санҷиш ва байрақча

Давраи берунӣ номзадҳоро мегузаронад, дарунӣ ҳар якеро месанҷад. Барои дар хотир нигоҳ доштани натиҷаи санҷиш тағйирёбанда-байрақча (флаг)-ро истифода мебаранд:

x = 91
ok = True              # ҳоло ҳеҷ чизи бад наёфтем
for d in range(2, 10):
    if x % d == 0:
        ok = False     # тақсимкунанда аз 2 то 9 ёфтем
        break
print(ok)              # False: 91 = 7 * 13

Байрақча пеш аз давраи дарунӣ гузошта мешавад — барои ҳар номзад аз нав. Агар онро як бор дар аввали барнома гузорӣ, он натиҷаи номзади пешинаро «дар хотир нигоҳ медорад».

break дар давраҳои дарунӣ

break танҳо аз ҳамон давре мебарояд, ки дар он навишта шудааст. Давраи берунӣ кори худро аз қимати навбатӣ идома медиҳад.

Ин чӣ қадар арзиш дорад

Ду давраи дарунии n-қадама n * n қадам медиҳанд. Ҳангоми n = 1000 ин як миллион аст — муқаррарӣ. Ҳангоми n = 10^5 — аллакай даҳ миллиард, ба вақт намерасад. Ба маҳдудиятҳо нигар: онҳо ишора мекунанд, ки чанд давраро дар ҳам ҷойгир кардан мумкин аст.

Хулоса

  • барои ҳар қадами давраи берунӣ давраи дарунӣ ҳамаи қадамҳои худро мегузарад;
  • давраи берунӣ — сатрҳо, дарунӣ — аломатҳо; print() пас аз дарунӣ ба сатри нав мегузаронад;
  • сарҳадҳои давраи дарунӣ метавонанд аз берунӣ вобаста бошанд, ҳамин тавр ҷуфтҳоро бе такрор мегузаронанд;
  • байрақчаро пеш аз давраи дарунӣ гузор;
  • шумораи қадамҳо — ҳосили зарби дарозиҳои давраҳо, ба маҳдудиятҳо диққат деҳ.