Лекция · 4.2

For циклі

Медеу бөгетінің 842 сатысынан өту керек десек, while циклінде «сатыдамын ба, жеттім бе?» деп үнемі тексеру керек еді. Ал енді сатылар саны АЛДЫН АЛА белгілі болса ше? «842 рет қадам жаса» деп ЖАЙ ҒАНА айтуға болмай ма? Дәл осындай жағдайларға арналған — for циклі: қайталану саны АЛДЫН АЛА белгілі болғанда қолданылатын, Python-дың ЕҢ ЖИІ қолданылатын цикл операторы.

For қашан керек

Өткен сабақта білдік: while — «қашан тоқтау керегі» белгілі болғанда. Ал for — «НЕШЕ РЕТ қайталау керегі» алдын ала белгілі болғанда. Футбол алаңын екі рет айналып жүгіру, 842 басқыштан өту, 1-ден 100-ге дейінгі сандарды қосу — бәрінде «неше рет» деген сан алдын ала белгілі.

Программалаудағы циклдер дәл осы белгіге қарай екіге бөлінеді: арифметикалық цикл (for) — саны белгілі, қадамдық цикл (while) — саны белгісіз.

for <цикл параметрі> in <range() функциясы>:
    цикл денесі
Range() функциясы

For-дың «жанары» — range() функциясы: ол саған қайталану ретін «ұсынады». Үш жазылу тәсілі бар:

ЖазылуыМағынасыМысал
range(n)0-ден n−1-ге дейінrange(6) → 0,1,2,3,4,5
range(k, n)k-дан n−1-ге дейінrange(6,11) → 6,7,8,9,10
range(k, n, x)k-дан n−1-ге дейін x қадамменrange(1,11,2) → 1,3,5,7,9

АЛТЫН ЕРЕЖЕ: range-тің соңғы саны НӘТИЖЕГЕ ЕШҚАШАН КІРМЕЙДІ. Бұл — Python-ды үйренушілердің ЕҢ ЖИІ шатасатын жері!

⚠️
Жиі қате: range(1, 21) деп жазып, 21 санының ШЫҒАДЫ деп ойлау. range(1,21) → 1-ден 20-ға дейін ғана. 21-ді ҚОСУ КЕРЕК болса, range(1, 22) жазу керек. Есептеу ережесі: «дейін» деген санды +1-ге көбейт.
🚌
Аналогия: range(k, n) — автобус аялдамалары сияқты: k — бірінші аялдама, n — СОҢҒЫ аялдамаНЫҢ АТЫ (өзіне тоқтамайды, тек соған дейін жүреді). Егер соңғы аялдамада да тоқтауы керек болса, келесі аялдаманың атын айту керек (n+1).
Есептер
Есеп 1: 0-ден 20-ға дейінгі барлық санды бір жолға шығар.
for i in range(20):
    print(i, end=' ')
Жауабы: 0 1 2 ... 18 19 (20 КІРМЕЙДІ). end=' ' — жаңа жолға көшпей, бос орынмен бөлу.
Есеп 2: 20-дан 1-ге дейін кему ретімен шығар.
for i in range(20, 0, -1):
    print(i, end=' ')
Жауабы: 20 19 18 ... 2 1. Қадам ТЕРІС болғанда, санауыш КЕМИДІ; 0 КІРМЕЙДІ.
Есеп 3: 1 мен n аралығындағы сандар қосындысы (n — пернетақтадан).
n = int(input("Enter n= "))
sum = 0
for i in range(1, n+1):
    sum += i
print(sum)
Неге n+1? n-ді ДЕ қосындыға қосу керек, ал range(1,n)-де n КІРМЕЙДІ! Тексеру: n=5 → 1+2+3+4+5 = 15.
Кірістірілген for

Енді ЕҢ КҮШТІ құралға көшейік: for циклінің ІШІНДЕ тағы бір for циклі.

Анықтама
Кірістірілген циклдер — бір цикл екіншісінің ІШІНЕ орналастырылған жағдай: сыртқы циклдің бір қадамы аяқталғанда ғана келесі сыртқы қадам басталады, ал әр сыртқы қадамда ішкі цикл ТОЛЫҚ орындалады.
Есеп: n=3 үшін көбейту кестесі.
n = 3
for x in range(1, n+1):
    for y in range(1, n+1):
        print(y, 'x', x, '=', y*x)
Логикасы: сыртқы x=1 болғанда ІШКІ y толық жүреді (1,2,3). Сосын сыртқы x=2 болады, ІШКІ y тағы толық жүреді. Барлығы 9 рет.
Есеп: 5×5 көбейту кестесін тіктөртбұрыш түрінде шығару.
for i in range(1, 6):
    for j in range(1, 6):
        print(i*j, end="\t")
    print()
Түсіндірме: ішкі print — табуляциямен бір жолда; СЫРТҚЫ print() (жақшасы бос!) — әр сыртқы қадамнан кейін ЖАҢА ЖОЛҒА көшу үшін.
⚠️
Жиі қате: ішкі print(i*j, end="\t") пен сыртқы print() (аргументсіз) шегінісі БАСҚА: біріншісі ІШКІ циклдің ішінде (екі деңгей шегініс), екіншісі СЫРТҚЫ циклдің ішінде, бірақ ІШКІ циклден ТЫС (бір деңгей шегініс).
Циклдер саны мен жұмыс уақыты

Маңызды практикалық сұрақ: неге циклдерді шексіз кірістіре беруге БОЛМАЙДЫ? Бір қарапайым цикл n рет жұмыс істейді. Екі кірістірілген цикл — n² рет. Үш кірістірілген цикл — n³ рет!

Санмен көрейік: n=100 болса, 3 кірістірілген цикл 100³ = 1 000 000 рет — жылдам. Бірақ n=1000 болса — 1000³ = 1 000 000 000 (МИЛЛИАРД) рет! Компьютердің 1 миллион операцияға ≈1 секунд кетсе, миллиард операцияға ≈1000 секунд, яғни ШАМАМЕН 17 МИНУТ кетеді.

🧹
Аналогия: бір қабатты циклді бір бөлмені тазалау десек, кірістірілген екі цикл — әр бөлменің ӘР БҰРЫШЫН тазалау, үш кірістірілген цикл — әр бұрыштың ӘР ЗАТЫН сүрту. Тереңдеген сайын жұмыс экспоненциалды өседі.
Есеп (for+if): N оқушының бойын енгізіп, 140 см-ден қысқаларды санау.
N = int(input('Оқушы саны ='))
z = 0
for i in range(1, N+1):
    x = int(input(str(i)+'-оқушының бойы='))
    if x < 140:
        z += 1
print('Бойы аласа оқушылар саны =', z)
Мысал: N=6, бойлар: 145, 137, 139, 150, 141, 138. 140-тан кішілер: 137, 139, 138 → z = 3.
🎯 ҰБТ байланысы
For циклі бойынша тексерілетін дағды.
1
range(n), range(k,n), range(k,n,x) нәтижесін дәл санау — соңғы мән кірмейтінін ұмытпа.
2
Кірістірілген циклде қанша рет қайталанатынын есептеу (сыртқы × ішкі).
3
«Дейін» деген санды range-ке беру үшін +1 қосу керегін білу.
4
Кірістірілген циклдегі print() орналасуын (шегінісін) талдау.
Сабақ қорытындысы
  • For — қайталану саны АЛДЫН АЛА белгілі болғандағы цикл: for i in range(...): денесі.
  • range(n) — 0-ден; range(k,n) — k-дан; range(k,n,x) — қадаммен; ЕШҚАШАН соңғы мән кірмейді.
  • Кірістірілген for циклдер екі өлшемді есептерге қолданылады (көбейту кестесі), бірақ жұмыс уақыты n^деңгей санына тәуелді өседі.
  • For + if қосындысы — санауыш есептерінің негізі.