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:
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:
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:
talabalar = ["Aziz", "Malika", "Sardor"]
for ism in talabalar:
print(f"Salom, {ism}!")
print("Tsikl tugadi")
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:
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:
'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:
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:
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:
| Yozuv | Maʼnosi | Natija |
|---|---|---|
range(5) | 0 dan 5 gaça (5 kirmaydi) | 0, 1, 2, 3, 4 |
range(2, 6) | 2 dan 6 gaça | 2, 3, 4, 5 |
range(0, 20, 5) | 0 dan 20 gaça, 5 qadam bilan | 0, 5, 10, 15 |
range(10, 0, -3) | 10 dan pastga, 3 qadam bilan | 10, 7, 4, 1 |
Eng muhim qoida: oxirgi son heç qaçon kirmaydi.
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:
[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:
yigindi = 0
for son in range(1, 101):
yigindi += son
print(yigindi)
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:
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:
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:
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.
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:
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:
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:
'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:
for qator in range(1, 4):
for ustun in range(1, 5):
print(f"({qator},{ustun})", end=" ")
print()
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:
# 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:
[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:
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:
{'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:
navbat = ["Jasur", "Nilufar", "Bekzod"]
for raqam, ism in enumerate(navbat, start=1):
print(f"{raqam}. {ism}")
Natija:
1. Jasur
2. Nilufar
3. Bekzod
enumerate() haqida 12-bobda batafsil gaplaşamiz.
Amaliyot: köpaytiriş jadvali
for i in range(1, 6):
qator = ""
for j in range(1, 6):
qator += f"{i * j:4}"
print(qator)
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:
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:
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:
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:
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.
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:
50? Kiçikroq son ayting.
25? Kattaroq son ayting.
40? Kiçikroq son ayting.
30? Kattaroq son ayting.
Topdingiz! 5 ta urinişda.
Xulosa
inqiymat töplamda bor-yöqligini tekşiradi; luğatlarda kalitlarni qaraydi.forröyxat, satr, kortej va luğat elementlarini navbat bilan aylanadi; luğat uçunitems()qulay.range(start, stop, step)— sonlar ketma-ketligi,stopheç qaçon kirmaydi.whileşart rost ekan işlaydi; şart qaçondirFalsebölişini taʼminlang.breaktsiklni töxtatadi,continuekeyingi qadamga ötadi,elseesabreakbölmasa işlaydi.Comprehension([... for ... if ...]) yangi röyxat, luğat yoki töplamni qisqa yoziş imkonini beradi.
Maşqlar
range()yordamida 1 dan 50 gaça bölgan, 3 ga ham, 5 ga ham bölinadigan sonlarni çiqaring.
Yeçim
for son in range(1, 51):
if son % 3 == 0 and son % 5 == 0:
print(son)
"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
matn = "Toşkent Samarqand Buxoro"
sanoq = {}
for harf in matn.lower():
if harf == " ":
continue
sanoq[harf] = sanoq.get(harf, 0) + 1
print(sanoq)
whileyordamida sonning raqamlari yiğindisini toping (masalan,2024→8). Satrga aylantirmang.
Yeçim
son = 2024
yigindi = 0
while son > 0:
yigindi += son % 10
son //= 10
print(yigindi)
Comprehensionyordamida talabalar luğatidan faqat 70 balldan yuqori olganlarning ismlarini röyxatga yiğing.
Yeçim
ballar = {"Aziza": 88, "Bobur": 64, "Dilşod": 91, "Kamola": 70}
alochilar = [ism for ism, ball in ballar.items() if ball > 70]
print(alochilar)
*belgisidan balandligi 5 bölgan uçburçak çizing (1-qatorda 1 ta, 5-qatorda 5 ta yulduzça).
Yeçim
for i in range(1, 6):
print("*" * i)