OzbekPython / Bob 10

Tsikllar

Bir işni köp marta takrorlaş — for va while tsikllari, range(), break/continue va comprehension ifodalari.

Boşlanğiç daraja21 daqiqa23 kod misoli10 / 24

Nega tsikl kerak?

Tasavvur qiling, sinfdagi 30 ta talabaning ismini çiqarişingiz kerak. 30 marta print() yoziş — zerikarli va xatoga moyil. Ertaga talabalar 31 ta bölsa-çi? Kodni yana özgartirasizmi?

Tsikl (loop) — bir xil işni köp marta takrorlaş usuli. Pythonda ikki xil tsikl bor: for (töplam elementlari böyiça yuriş) va while (şart rost ekan, takrorlaş).

in operatori

Tsikllardan oldin in sözi bilan tanişamiz. U biror qiymat töplam içida bor-yöqligini tekşiradi va True yoki False qaytaradi:

Python
mevalar = ["olma", "anor", "uzum"]

print("anor" in mevalar)
print("banan" in mevalar)
print("banan" not in mevalar)
print("toşkent" in "toşkent şahri")

Natija:

Natija
True
False
True
True

Luğatlarda (dict) in kalitlarni tekşiradi, qiymatlarni emas. Bu söz for tsiklida ham işlatiladi, lekin u yerda biroz boşqaça maʼno beradi — "har bir element uçun".

for tsikli

for tsikli töplamdagi har bir elementni navbat bilan özgaruvçiga yozadi va blokni bajaradi:

Python
talabalar = ["Aziz", "Malika", "Sardor"]

for ism in talabalar:
    print(f"Salom, {ism}!")

print("Tsikl tugadi")

Natija:

Natija
Salom, Aziz!
Salom, Malika!
Salom, Sardor!
Tsikl tugadi

Satr ham töplam: for uni harfma-harf aylanib çiqadi. Kortej (tuple) bilan ham xuddi şunday işlaydi:

Python
soz = "kitob"
unlilar = 0

for harf in soz:
    if harf in "aeiou":
        unlilar += 1

print(f"'{soz}' sözida {unlilar} ta unli bor")

for rang in ("qizil", "yaşil"):
    print(rang.upper())

Natija:

Natija
'kitob' sözida 2 ta unli bor
QIZIL
YAŞIL

Luğatlar ustida tsikl

Luğatni töğridan-töğri aylansangiz, faqat kalitlar keladi. Kalit va qiymatni birga oliş uçun items() metodini işlating:

Python
narxlar = {"non": 4000, "sut": 12000, "tuxum": 18000}

for mahsulot in narxlar:
    print(mahsulot)

jami = 0
for mahsulot, narx in narxlar.items():
    print(f"{mahsulot:<6} {narx:>7,} söm")
    jami += narx

print(f"Jami: {jami:,} söm")

Natija:

Natija
non
sut
tuxum
non      4,000 söm
sut     12,000 söm
tuxum   18,000 söm
Jami: 34,000 söm

for mahsulot, narx in ... yozuvi har bir (kalit, qiymat) juftligini ikki özgaruvçiga ajratadi. Faqat qiymatlar kerak bölsa — values().

range() funksiyasi

Köpinça "5 marta takrorla" yoki "1 dan 100 gaça sanab çiq" kerak böladi. Buning uçun range() bor. U uç xil körinişda işlatiladi:

YozuvMaʼnosiNatija
range(5)0 dan 5 gaça (5 kirmaydi)0, 1, 2, 3, 4
range(2, 6)2 dan 6 gaça2, 3, 4, 5
range(0, 20, 5)0 dan 20 gaça, 5 qadam bilan0, 5, 10, 15
range(10, 0, -3)10 dan pastga, 3 qadam bilan10, 7, 4, 1

Eng muhim qoida: oxirgi son heç qaçon kirmaydi.

Python
print(list(range(5)))
print(list(range(1, 11, 2)))
print(list(range(5, 0, -1)))

for i in range(3):
    print("Takrorlaş", i)

Natija:

Natija
[0, 1, 2, 3, 4]
[1, 3, 5, 7, 9]
[5, 4, 3, 2, 1]
Takrorlaş 0
Takrorlaş 1
Takrorlaş 2

Masalan, 1 dan 100 gaça sonlar yiğindisi:

Python
yigindi = 0
for son in range(1, 101):
    yigindi += son
print(yigindi)

Natija:

Natija
5050

while tsikli

while (toki) şart rost ekan, blokni qayta-qayta bajaradi. Takrorlaşlar soni oldindan nomaʼlum bölganda qulay. Masalan, omonatga qöyilgan pul neça yilda ikki baravar bölişini hisoblaylik:

Python
omonat = 10_000_000   # söm
foiz = 0.2            # yillik 20%
yil = 0

while omonat < 20_000_000:
    omonat *= 1 + foiz
    yil += 1

print(f"{yil} yildan keyin: {omonat:,.0f} söm")

Natija:

Natija
4 yildan keyin: 20,736,000 söm

Çeksiz tsikl xavfi

while işlatganda şart qaçondir False bölişiga işonç hosil qiling. Quyidagi kod heç qaçon töxtamaydi, çunki i özgarmaydi:

Python
i = 0
while i < 5:
    print(i)
    # i += 1 yoziş esdan çiqdi!

Agar dastur "osilib" qolsa, terminalda Ctrl + C tugmalarini bosib töxtating.

break, continue va else

  • break — tsiklni darhol töxtatadi.
  • continue — joriy qadamning qolgan qismini taşlab, keyingi qadamga ötadi.
Python
haftalik_harorat = [21, 24, -2, 19, 30, 27]

for t in haftalik_harorat:
    if t < 0:
        print(f"{t} - sensor xatosi, ötkazib yuboramiz")
        continue
    if t >= 30:
        print(f"{t} - jazirama! Tekşiruv töxtatildi.")
        break
    print(f"{t} - normal")

Natija:

Natija
21 - normal
24 - normal
-2 - sensor xatosi, ötkazib yuboramiz
19 - normal
30 - jazirama! Tekşiruv töxtatildi.

Tsikllarning kam maʼlum xususiyati — else bloki. U tsikl break siz oxirigaça yetib borgandagina bajariladi. Bu "qidirdim, lekin topmadim" holati uçun juda qulay:

Python
kitoblar = ["Ötkan kunlar", "Keça va kunduz", "Sarob"]
qidiruv = "Ufq"

for kitob in kitoblar:
    if kitob == qidiruv:
        print("Kitob topildi!")
        break
else:
    print(f"'{qidiruv}' dökonda yöq")

Natija:

Natija
'Ufq' dökonda yöq

Içma-iç tsikllar

Tsikl içida boşqa tsikl yoziş mumkin. Içki tsikl taşqi tsiklning har bir qadamida töliq bajariladi:

Python
for qator in range(1, 4):
    for ustun in range(1, 5):
        print(f"({qator},{ustun})", end=" ")
    print()

Natija:

Natija
(1,1) (1,2) (1,3) (1,4)
(2,1) (2,2) (2,3) (2,4)
(3,1) (3,2) (3,3) (3,4)

print(..., end=" ") yangi qatorga ötmasdan böş joy qöyadi, böş print() esa qatorni tugatadi. Içma-iç tsikllar 3 x 4 = 12 marta işladi — katta sonlarda bu sekinlaşişi mumkin, şuni yodda tuting.

Comprehension ifodalari

Yangi röyxat hosil qiliş uçun odatda böş röyxat yaratib, tsiklda append() qilamiz. Pythonda buning qisqa va tezroq usuli bor — list comprehension:

Python
# Oddiy usul
kvadratlar = []
for n in range(1, 6):
    kvadratlar.append(n ** 2)
print(kvadratlar)

# Comprehension
kvadratlar = [n ** 2 for n in range(1, 6)]
print(kvadratlar)

# Şart bilan: faqat juft sonlar
juftlar = [n for n in range(1, 11) if n % 2 == 0]
print(juftlar)

Natija:

Natija
[1, 4, 9, 16, 25]
[1, 4, 9, 16, 25]
[2, 4, 6, 8, 10]

Xuddi şu ğoya luğat (dict) va töplam (set) uçun ham işlaydi:

Python
narxlar_usd = {"telefon": 250, "quloqçin": 30, "noutbuk": 700}
kurs = 12_800

narxlar_som = {nom: usd * kurs for nom, usd in narxlar_usd.items()}
print(narxlar_som)

qimmatlar = {nom for nom, usd in narxlar_usd.items() if usd > 100}
print(sorted(qimmatlar))

ismlar = ["ali", "Vali", "ALI", "vali", "Gulnora"]
print(sorted({ism.title() for ism in ismlar}))

Natija:

Natija
{'telefon': 3200000, 'quloqçin': 384000, 'noutbuk': 8960000}
['noutbuk', 'telefon']
['Ali', 'Gulnora', 'Vali']

Şartli ifodani ham işlatiş mumkin: ["juft" if n % 2 == 0 else "toq" for n in sonlar]. Lekin comprehension bitta qatorga siğmay qolsa, oddiy for tsikliga qayting — öqiluvçanlik muhimroq.

enumerate() bilan tanişuv

Elementning tartib raqami ham kerak bölsa, range(len(...)) örniga enumerate() işlating:

Python
navbat = ["Jasur", "Nilufar", "Bekzod"]

for raqam, ism in enumerate(navbat, start=1):
    print(f"{raqam}. {ism}")

Natija:

Natija
1. Jasur
2. Nilufar
3. Bekzod

enumerate() haqida 12-bobda batafsil gaplaşamiz.

Amaliyot: köpaytiriş jadvali

Python
for i in range(1, 6):
    qator = ""
    for j in range(1, 6):
        qator += f"{i * j:4}"
    print(qator)

Natija:

Natija
   1   2   3   4   5
   2   4   6   8  10
   3   6   9  12  15
   4   8  12  16  20
   5  10  15  20  25

{i * j:4} har bir sonni 4 belgi kenglikda, öngga tekislab çiqaradi — şuning uçun ustunlar tekis turadi.

Amaliyot: bankomat menyusi

Haqiqiy bankomat foydalanuvçi "çiqiş" tugmasini bosmagunça menyuni qayta-qayta körsatadi. Bu while True + break uçun klassik misol. Brauzerda işlaşi uçun foydalanuvçi tanlovlarini oldindan röyxatga yozib qöydik:

Python
balans = 500_000
tanlovlar = ["1", "2", "3", "2", "9", "4"]   # foydalanuvçi bosgan tugmalar
summalar = [200_000, 500_000]                # yeçib olmoqçi bölgan summalar

qadam = 0
while True:
    tanlov = tanlovlar[qadam]   # haqiqiy dasturda: input("Tanlang: ")
    qadam += 1

    if tanlov == "1":
        print(f"Balans: {balans:,} söm")
    elif tanlov == "2":
        summa = summalar.pop(0)
        if summa > balans:
            print(f"{summa:,} söm uçun mablag' yetarli emas")
        else:
            balans -= summa
            print(f"{summa:,} söm berildi")
    elif tanlov == "3":
        balans += 100_000
        print("100,000 söm hisobga qöşildi")
    elif tanlov == "4":
        print("Kartangizni oling. Xayr!")
        break
    else:
        print(f"'{tanlov}' - notöğri tanlov")

Natija:

Natija
Balans: 500,000 söm
200,000 söm berildi
100,000 söm hisobga qöşildi
500,000 söm uçun mablag' yetarli emas
'9' - notöğri tanlov
Kartangizni oling. Xayr!

Amaliyot: faktorial va Fibonaççi

n! (faktorial) — 1 dan n gaça bölgan sonlar köpaytmasi. Fibonaççi ketma-ketligida esa har bir son oldingi ikkitasining yiğindisi:

Python
n = 6
faktorial = 1
for i in range(2, n + 1):
    faktorial *= i
print(f"{n}! = {faktorial}")

a, b = 0, 1
fib = []
while a < 100:
    fib.append(a)
    a, b = b, a + b
print(fib)

Natija:

Natija
6! = 720
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

a, b = b, a + b qatori ikkala qiymatni bir vaqtda yangilaydi — vaqtinçalik özgaruvçi kerak emas.

Amaliyot: sonni topiş öyini

Kompyuter son "öylaydi", foydalanuvçi esa uni topişga harakat qiladi. Bu yerda ham taxminlar oldindan yozilgan; özingiz öynaş uçun random.randint(1, 100) va input() işlating.

Python
yashirin = 37
taxminlar = [50, 25, 40, 30, 37]
urinish = 0

while urinish < len(taxminlar):
    taxmin = taxminlar[urinish]
    urinish += 1
    if taxmin < yashirin:
        print(f"{taxmin}? Kattaroq son ayting.")
    elif taxmin > yashirin:
        print(f"{taxmin}? Kiçikroq son ayting.")
    else:
        print(f"Topdingiz! {urinish} ta urinişda.")
        break
else:
    print(f"Urinişlar tugadi. Javob: {yashirin}")

Natija:

Natija
50? Kiçikroq son ayting.
25? Kattaroq son ayting.
40? Kiçikroq son ayting.
30? Kattaroq son ayting.
Topdingiz! 5 ta urinişda.

Xulosa

  • in qiymat töplamda bor-yöqligini tekşiradi; luğatlarda kalitlarni qaraydi.
  • for röyxat, satr, kortej va luğat elementlarini navbat bilan aylanadi; luğat uçun items() qulay.
  • range(start, stop, step) — sonlar ketma-ketligi, stop heç qaçon kirmaydi.
  • while şart rost ekan işlaydi; şart qaçondir False bölişini taʼminlang.
  • break tsiklni töxtatadi, continue keyingi qadamga ötadi, else esa break bölmasa işlaydi.
  • Comprehension ([... for ... if ...]) yangi röyxat, luğat yoki töplamni qisqa yoziş imkonini beradi.

Maşqlar

  1. range() yordamida 1 dan 50 gaça bölgan, 3 ga ham, 5 ga ham bölinadigan sonlarni çiqaring.
Yeçim
Python
for son in range(1, 51):
    if son % 3 == 0 and son % 5 == 0:
        print(son)
  1. "Toşkent Samarqand Buxoro" satridagi har bir harf neça marta uçraşini luğatga yiğing (böş joyni hisobga olmang, harflarni kiçik qilib oling).
Yeçim
Python
matn = "Toşkent Samarqand Buxoro"
sanoq = {}

for harf in matn.lower():
    if harf == " ":
        continue
    sanoq[harf] = sanoq.get(harf, 0) + 1

print(sanoq)
  1. while yordamida sonning raqamlari yiğindisini toping (masalan, 2024 → 8). Satrga aylantirmang.
Yeçim
Python
son = 2024
yigindi = 0

while son > 0:
    yigindi += son % 10
    son //= 10

print(yigindi)
  1. Comprehension yordamida talabalar luğatidan faqat 70 balldan yuqori olganlarning ismlarini röyxatga yiğing.
Yeçim
Python
ballar = {"Aziza": 88, "Bobur": 64, "Dilşod": 91, "Kamola": 70}

alochilar = [ism for ism, ball in ballar.items() if ball > 70]
print(alochilar)
  1. * belgisidan balandligi 5 bölgan uçburçak çizing (1-qatorda 1 ta, 5-qatorda 5 ta yulduzça).
Yeçim
Python
for i in range(1, 6):
    print("*" * i)