Mundarija (23)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. break — sikldan chiqish
- 2.2. continue — keyingi iteratsiya
- 2.3. Sikl else
- 2.4. break va continue — qachon
- 2.5. break va else — qidiruv naqshlari
- 2.6. break/continue va resurs tozalash
- 2.7. break generatorlarda
- 2.8. Alternativalar
- 2.9. Tezlik
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — break va continue asoslari
- Misol 2 — Sikl else
- Misol 3 — Alternativalar
- Misol 4 — Amaliy: log tahlilchisi
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
5.10-dars: break, continue, sikl else
5-QISM — BOSHQARUV OQIMI · 10-dars
1. Kirish va motivatsiya
Sikl har doim boshidan oxirigacha ishlashi shart emas. Ba'zan:
- Erta chiqish kerak — kerakli narsa topildi
- Elementni o'tkazib yuborish kerak — u mos emas
- Sikl to'liq tugadimi yoki uzildimi — bilish kerak
Bu uch ehtiyoj uchun uch vosita bor:
break # sikldan butunlay chiqish
continue # keyingi iteratsiyaga o'tish
else # sikl BREAK SIZ tugagandaUlar oldingi darslarda tegib o'tildi. Bu darsda to'liq ko'ramiz — chunki ular bilan bir necha nozik jihat bor:
for i in range(3):
for j in range(3):
if shart:
break # ← qaysi sikldan chiqadi?while i < 10:
if shart:
continue # ← i oshmadi → cheksiz sikl
i += 1for x in royxat:
...
else:
print("...") # ← qachon bajariladi?2. Nazariya — chuqur tushuntirish
2.1. break — sikldan chiqish
for x in [1, 2, 3, 4, 5]:
if x > 3:
break
print(x)1
2
3break — eng yaqin siklni to'xtatadi:
for i in range(3):
for j in range(3):
if j == 1:
break # faqat ICHKI sikldan
print(i, j)0 0
1 0
2 0 Pythonda break label yo'q. Ba'zi tillarda (Java, JavaScript) tashqi sikldan chiqish uchun yorliq bor:
tashqi:
for (...) {
for (...) {
break tashqi; // Java
}
}Pythonda — yo'q. Yechimlar 11-darsda.
break qayerda ishlaydi:
for ...: break # ✅
while ...: break # ✅
if shart: break # ❌ SyntaxError — sikldan tashqarida
def f(): break # ❌ SyntaxErrortry/finally bilan:
for x in royxat:
try:
if shart(x):
break # finally BARIBIR bajariladi
finally:
tozalash()9-qismda batafsil.
2.2. continue — keyingi iteratsiya
for x in [1, 2, 3, 4, 5]:
if x % 2 == 0:
continue # juftlarni o'tkazib yuborish
print(x)1
3
5continue — sikl tanasining qolgan qismini o'tkazib yuboradi:
for x in range(5):
print(f" boshi: {x}")
if x == 2:
continue
print(f" oxiri: {x}") boshi: 0
oxiri: 0
boshi: 1
oxiri: 1
boshi: 2 ← "oxiri: 2" YO'Q
boshi: 3
oxiri: 3
boshi: 4
oxiri: 4 while da tuzoq (5-dars):
i = 0
while i < 5:
if i == 2:
continue # ❌ i o'zgarmadi → CHEKSIZ
print(i)
i += 1Yechim — o'zgarishni continue dan oldin:
i = 0
while i < 5:
i += 1 # ✅
if i == 3:
continue
print(i)for da bunday muammo yo'q — iterator o'zi keyingi elementga o'tadi.
continue — qo'riqchi shart siklda (2-dars):
# ❌ Chuqur ichma-ich
for qator in qatorlar:
if qator.strip():
if not qator.startswith("#"):
if "=" in qator:
ishla(qator)
# ✅ continue bilan
for qator in qatorlar:
if not qator.strip():
continue
if qator.startswith("#"):
continue
if "=" not in qator:
continue
ishla(qator)Chekinish bir daraja — o'qish ancha oson.
2.3. Sikl else
5-darsda while/else ni ko'rdik. for/else ham bir xil ishlaydi:
for x in royxat:
if shart(x):
break
else:
# break BO'LMASA bajariladi
print("Topilmadi")Uch holat:
# 1. break bilan — else BAJARILMAYDI
for x in [1, 2, 3]:
if x == 2:
break
else:
print("else") # ← bajarilmaydi
# 2. break siz — else BAJARILADI
for x in [1, 2, 3]:
pass
else:
print("else") # ← bajariladi ✅
# 3. Bo'sh to'plam — else BAJARILADI
for x in []:
pass
else:
print("else") # ← bajariladi ✅ return bilan ham else bajarilmaydi:
def f(royxat):
for x in royxat:
if shart(x):
return x
else:
print("else") # ← return bo'lsa bajarilmaydi
return NoneAslida return funksiyadan chiqadi, shuning uchun else ga yetib bo'lmaydi. Bunday holatda else ortiqcha:
def f(royxat):
for x in royxat:
if shart(x):
return x
return None # ✅ else kerak emas Nom chalkash. Guido van Rossum: "nobreak deb nomlash kerak edi".
Uni tushunish uchun izoh yozing:
for x in royxat:
if shart(x):
break
else:
# Sikl break siz tugadi — element topilmadi
...Qachon foydali:
# ❌ Bayroq bilan
topildi = False
for x in royxat:
if shart(x):
topildi = True
break
if not topildi:
xato()
# ✅ else bilan
for x in royxat:
if shart(x):
break
else:
xato()Klassik misol — tub sonlar:
for n in range(2, 20):
for d in range(2, int(n ** 0.5) + 1):
if n % d == 0:
break
else:
print(n, end=" ") # tub son2 3 5 7 11 13 17 19Bu — Pythonning rasmiy hujjatidagi klassik misol.
2.4. break va continue — qachon
break — natija topilganda:
# Birinchi mos elementni topish
for x in royxat:
if shart(x):
natija = x
breakLekin ko'p holatda yaxshiroq usul bor:
# ✅ Generator bilan (10-qism)
natija = next((x for x in royxat if shart(x)), None)
# ✅ Funksiyada return
def topish(royxat):
for x in royxat:
if shart(x):
return x
return Nonecontinue — filtrlash:
for x in royxat:
if not shart(x):
continue
ishla(x)Lekin ko'p holatda yaxshiroq:
# ✅ Generator ifodasi
for x in (y for y in royxat if shart(y)):
ishla(x)
# ✅ filter
for x in filter(shart, royxat):
ishla(x)
# ✅ Ro'yxat generatori
for x in [y for y in royxat if shart(y)]:
ishla(x)Qachon continue afzal:
# Bir necha tekshiruv — har birining sababi bilan
for qator in fayl:
if not qator.strip():
continue # bo'sh qator
if qator.startswith("#"):
continue # izoh
if len(qator) > MAX:
log(f"Juda uzun: {qator[:50]}")
continue # xato, lekin davom etamiz
ishla(qator)Bu yerda har bir continue — alohida sabab va ba'zilari qo'shimcha ish qiladi. Generator bilan buni ifodalash qiyin.
2.5. break va else — qidiruv naqshlari
1. Birinchi mos element:
# else bilan
for x in royxat:
if shart(x):
natija = x
break
else:
natija = None
# ✅ Generator bilan — qisqaroq
natija = next((x for x in royxat if shart(x)), None)2. Barcha element mos keladimi:
# else bilan
for x in royxat:
if not shart(x):
hammasi_mos = False
break
else:
hammasi_mos = True
# ✅ all() bilan (3.5-dars)
hammasi_mos = all(shart(x) for x in royxat)3. Kamida bittasi mos keladimi:
# ✅ any() bilan
kamida_bittasi = any(shart(x) for x in royxat)4. Indeks topish:
# else bilan
for i, x in enumerate(royxat):
if x == qidiruv:
break
else:
i = -1
# ✅ Generator bilan
i = next((i for i, x in enumerate(royxat) if x == qidiruv), -1)Xulosa: for/else kam kerak — any, all, next ko'pincha aniqroq.
else haqiqatan foydali holatlar:
# 1. Sikl ichida murakkab ish bo'lsa
for urinish in range(3):
try:
natija = sorov()
break
except TimeoutError:
time.sleep(2 ** urinish)
else:
raise RuntimeError("Barcha urinish muvaffaqiyatsiz")
# 2. Ichma-ich sikl (11-dars)
for i in range(n):
for j in range(m):
if jadval[i][j] == qidiruv:
break
else:
continue
break
else:
print("Topilmadi")Ikkinchisi — chalkash, funksiyaga o'rash yaxshiroq.
2.6. break/continue va resurs tozalash
break resursni oqizishi mumkin:
# ❌ Fayl yopilmadi
for yol in yollar:
f = open(yol)
if shart:
break # f.close() chaqirilmadi
f.close()
# ✅ with bilan
for yol in yollar:
with open(yol) as f:
if shart:
break # ✅ with fayl yopaditry/finally bilan:
for x in royxat:
resurs = ol()
try:
if shart(x):
break
ishla(resurs)
finally:
ozod(resurs) # ✅ break bo'lsa ham bajariladi10 va 9-qismlarda batafsil.
2.7. break generatorlarda
Generator bilan break — maxsus holat:
def generator():
for i in range(5):
print(f" yield {i}")
yield i
print(" generator tugadi")
for x in generator():
if x == 2:
break yield 0
yield 1
yield 2break bo'lganda generator to'xtatiladi — qolgan kod bajarilmaydi.
Tozalash kerak bo'lsa try/finally:
def generator():
try:
for i in range(5):
yield i
finally:
print(" tozalash") # ✅ break bo'lsa ham bajariladi
for x in generator():
if x == 2:
break tozalash10-qismda batafsil.
2.8. Alternativalar
break o'rniga:
# 1. Funksiyada return
def topish(royxat):
for x in royxat:
if shart(x):
return x
return None
# 2. next() bilan
natija = next((x for x in royxat if shart(x)), None)
# 3. itertools.takewhile
from itertools import takewhile
for x in takewhile(lambda y: y < 10, royxat):
...
# 4. Shart bilan while
while shart():
...continue o'rniga:
# 1. Generator ifodasi
for x in (y for y in royxat if shart(y)):
...
# 2. filter
for x in filter(shart, royxat):
...
# 3. itertools.dropwhile / filterfalse
from itertools import filterfalse
for x in filterfalse(shart, royxat):
...
# 4. Ro'yxat generatori
for x in [y for y in royxat if shart(y)]:
...for/else o'rniga:
# 1. any() / all()
if any(shart(x) for x in royxat): ...
if all(shart(x) for x in royxat): ...
# 2. next() sukut bilan
natija = next((x for x in royxat if shart(x)), None)
if natija is None: ...
# 3. Funksiyada return
def topish(royxat):
for x in royxat:
if shart(x):
return x
return None # "else" o'rnigaQaror:
| Vaziyat | Yechim |
|---|---|
| Birinchi mos elementni topish | next(gen, None) |
| Barcha mos keladimi | all(...) |
| Kamida bittasi | any(...) |
| Filtrlash | Generator yoki filter |
| Murakkab tekshiruvlar zanjiri | continue |
| Sikl ichida qayta urinish | break + else |
| Ichma-ich sikldan chiqish | Funksiya + return |
2.9. Tezlik
import time
N = 1_000_000
royxat = list(range(N))
qidiruv = N - 1
# break bilan
boshlandi = time.perf_counter()
for x in royxat:
if x == qidiruv:
natija1 = x
break
vaqt_break = time.perf_counter() - boshlandi
# next() bilan
boshlandi = time.perf_counter()
natija2 = next((x for x in royxat if x == qidiruv), None)
vaqt_next = time.perf_counter() - boshlandi
# in bilan
boshlandi = time.perf_counter()
natija3 = qidiruv if qidiruv in royxat else None
vaqt_in = time.perf_counter() - boshlandi
# index bilan
boshlandi = time.perf_counter()
natija4 = royxat[royxat.index(qidiruv)]
vaqt_index = time.perf_counter() - boshlandiin va .index() — C darajasida, shuning uchun tezroq.
continue tezligi:
# continue bilan
for x in royxat:
if x % 2:
continue
jami += x
# Generator bilan
jami = sum(x for x in royxat if x % 2 == 0)Generator odatda tezroq — chunki sikl C darajasida.
3. Tez ma'lumotnoma
Uch vosita
break sikldan butunlay chiqish (ENG YAQIN sikldan)
continue keyingi iteratsiyaga o'tish
else sikl BREAK SIZ tugagandaTuzoqlar
while i < n:
if shart: continue ❌ i o'zgarmadi → cheksiz
i += 1
while i < n:
i += 1 ✅ continue dan OLDIN
if shart: continue
for i in ...:
for j in ...:
break ← faqat ICHKI sikldanelse — "nobreak"
for x in royxat:
if shart(x): break
else:
# break BO'LMASA
...
break bilan → else YO'Q
break siz → else BAJARILADI
bo'sh to'plam → else BAJARILADI
return bilan → else ga yetib bo'lmaydiAlternativalar
break + else → next((x for x in y if c), None)
→ any(...) / all(...)
→ funksiyada return
continue → (x for x in y if c)
→ filter(c, y)
ichma-ich break → funksiya + returnResurs
for x in y:
with open(...) as f: ✅ break xavfsiz
if c: break4. Batafsil misollar
Misol 1 — break va continue asoslari
"""Sikl oqimini boshqarish."""
print("=== 1. break — sikldan chiqish ===")
for x in [1, 2, 3, 4, 5]:
if x > 3:
print(f" break at {x}")
break
print(f" {x}")
print("\n\n=== 2. continue — keyingi iteratsiya ===")
for x in range(5):
print(f" boshi: {x}", end="")
if x == 2:
print(" → continue")
continue
print(f" oxiri: {x}")
print("\n\n=== 3. ⚠️ while + continue tuzog'i ===")
print(" ❌ Cheksiz sikl (namoyish uchun cheklovli):")
i = 0
iteratsiya = 0
while i < 5 and iteratsiya < 10:
iteratsiya += 1
if i == 2:
continue # ❌ i o'zgarmaydi
print(f" i={i}", end="")
i += 1
print(f"\n ← {iteratsiya} iteratsiyada to'xtatildi (cheklov bilan)")
print("\n ✅ To'g'ri — o'zgarish continue dan OLDIN:")
i = 0
while i < 5:
i += 1
if i == 3:
continue
print(f" i={i}", end="")
print()
print("\n\n=== 4. break — faqat ichki sikldan ===")
for i in range(3):
for j in range(3):
if j == 1:
break # faqat ichki
print(f" ({i}, {j})", end="")
print()
print(" ← Tashqi sikl davom etdi (3 marta)")
print("\n\n=== 5. continue bilan qo'riqchi shart ===")
QATORLAR = [
"host = localhost",
"",
"# Bu izoh",
"port = 8000",
" ",
"notogri qator",
"debug = true",
]
print(" ❌ Ichma-ich if:")
print(""" for qator in qatorlar:
if qator.strip():
if not qator.startswith("#"):
if "=" in qator:
ishla(qator)""")
print("\n ✅ continue bilan:")
for qator in QATORLAR:
if not qator.strip():
continue
if qator.strip().startswith("#"):
continue
if "=" not in qator:
print(f" ⚠️ Noto'g'ri: {qator!r}")
continue
kalit, _, qiymat = qator.partition("=")
print(f" ✅ {kalit.strip():<8} = {qiymat.strip()!r}")
print("\n\n=== 6. break va resurs ===")
import io
FAYLLAR = {
"a.txt": "birinchi\nkerakli\n",
"b.txt": "ikkinchi\n",
}
def soxta_open(nom):
return io.StringIO(FAYLLAR[nom])
print(" ✅ with bilan — break xavfsiz:")
for nom in FAYLLAR:
with soxta_open(nom) as f:
for qator in f:
if "kerakli" in qator:
print(f" {nom} da topildi: {qator.strip()!r}")
break
# with fayl yopdi — break bo'lsa ham
print(" ← Barcha fayl to'g'ri yopildi")Natijaning muhim qismi:
=== 3. ⚠️ while + continue tuzog'i ===
❌ Cheksiz sikl (namoyish uchun cheklovli):
i=0 i=1
← 10 iteratsiyada to'xtatildi (cheklov bilan)
✅ To'g'ri — o'zgarish continue dan OLDIN:
i=1 i=2 i=4 i=5
=== 5. continue bilan qo'riqchi shart ===
✅ continue bilan:
✅ host = 'localhost'
✅ port = '8000'
⚠️ Noto'g'ri: 'notogri qator'
✅ debug = 'true'Nima ko'rsatdi: 2.1, 2.2, 2.6-bo'limlar.
Misol 2 — Sikl else
"""for/else va while/else."""
print("=== 1. Uch holat ===")
print(" break BILAN:")
for x in [1, 2, 3]:
if x == 2:
print(f" break at {x}")
break
else:
print(" else — BAJARILMAYDI")
print("\n break SIZ:")
for x in [1, 2, 3]:
pass
else:
print(" else — bajarildi ✅")
print("\n Bo'sh to'plam:")
for x in []:
print(" bajarilmaydi")
else:
print(" else — bajarildi ✅")
print("\n return bilan (funksiya ichida):")
def f():
for x in [1, 2, 3]:
if x == 2:
return "return"
else:
return "else"
return "oxiri"
print(f" f() = {f()!r}")
print("\n\n=== 2. Qidiruv naqshi ===")
ROYXAT = [3, 7, 12, 5, 9]
for qidiruv in [12, 100]:
print(f"\n Qidiruv: {qidiruv}")
# ❌ Bayroq bilan
topildi = False
for i, x in enumerate(ROYXAT):
if x == qidiruv:
topildi = True
break
if topildi:
print(f" Bayroq bilan: topildi (indeks {i})")
else:
print(f" Bayroq bilan: topilmadi")
# ✅ else bilan
for i, x in enumerate(ROYXAT):
if x == qidiruv:
print(f" else bilan: topildi (indeks {i})")
break
else:
print(f" else bilan: topilmadi")
# ✅✅ next bilan — eng qisqa
indeks = next((i for i, x in enumerate(ROYXAT) if x == qidiruv), -1)
natija = f"topildi (indeks {indeks})" if indeks >= 0 else "topilmadi"
print(f" next bilan: {natija}")
print("\n\n=== 3. Klassik misol: tub sonlar ===")
print(" 2 dan 30 gacha tub sonlar:")
tublar = []
for n in range(2, 31):
for d in range(2, int(n ** 0.5) + 1):
if n % d == 0:
break
else:
tublar.append(n)
print(f" {tublar}")
print("\n Bu — Pythonning rasmiy hujjatidagi klassik misol")
print("\n\n=== 4. Qayta urinish ===")
import time
urinishlar = [0]
def beqaror():
urinishlar[0] += 1
if urinishlar[0] < 3:
raise TimeoutError(f"Urinish #{urinishlar[0]}")
return f"✅ Natija (urinish #{urinishlar[0]})"
MAX_URINISH = 5
for urinish in range(1, MAX_URINISH + 1):
try:
natija = beqaror()
print(f" {natija}")
break
except TimeoutError as x:
print(f" {x} — qayta urinish...")
time.sleep(0.05)
else:
print(f" ❌ {MAX_URINISH} urinishdan keyin ham muvaffaqiyatsiz")
print("\n\n=== 5. Alternativalar bilan solishtirish ===")
ROYXAT = [3, 7, 12, 5, 9]
def shart(x):
return x > 10
print(f" Ro'yxat: {ROYXAT}, shart: x > 10\n")
# 1. Birinchi mos element
print(" Birinchi mos element:")
for x in ROYXAT:
if shart(x):
natija = x
break
else:
natija = None
print(f" for/else: {natija}")
print(f" next(): {next((x for x in ROYXAT if shart(x)), None)}")
# 2. Barcha mos keladimi
print("\n Barcha mos keladimi:")
for x in ROYXAT:
if not shart(x):
hammasi = False
break
else:
hammasi = True
print(f" for/else: {hammasi}")
print(f" all(): {all(shart(x) for x in ROYXAT)}")
# 3. Kamida bittasi
print("\n Kamida bittasi:")
for x in ROYXAT:
if shart(x):
bittasi = True
break
else:
bittasi = False
print(f" for/else: {bittasi}")
print(f" any(): {any(shart(x) for x in ROYXAT)}")
print("\n ⭐ Xulosa: any/all/next ko'pincha ANIQROQ")
print("\n\n=== 6. ⚠️ Nom chalkashligi ===")
print("""
`else` bu yerda "aks holda" EMAS.
U "nobreak" — "break bo'lmasa" degani.
Guido van Rossum: "bu nom xato edi".
Ko'p dasturchi uni bilmaydi — IZOH yozing:
for x in royxat:
if shart(x):
break
else:
# Sikl break siz tugadi — element topilmadi
...
""")Natijaning muhim qismi:
=== 1. Uch holat ===
break BILAN:
break at 2
break SIZ:
else — bajarildi ✅
Bo'sh to'plam:
else — bajarildi ✅
return bilan (funksiya ichida):
f() = 'return'
=== 3. Klassik misol: tub sonlar ===
2 dan 30 gacha tub sonlar:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
=== 4. Qayta urinish ===
Urinish #1 — qayta urinish...
Urinish #2 — qayta urinish...
✅ Natija (urinish #3)Nima ko'rsatdi: 2.3, 2.5-bo'limlar.
Misol 3 — Alternativalar
"""break/continue o'rniga nima ishlatish mumkin."""
import time
from itertools import takewhile, dropwhile, filterfalse
print("=== 1. break o'rniga ===")
ROYXAT = list(range(1, 21))
print(f" Ro'yxat: {ROYXAT}\n")
# 1. break
natija = []
for x in ROYXAT:
if x > 10:
break
natija.append(x)
print(f" break bilan: {natija}")
# 2. takewhile
print(f" takewhile: {list(takewhile(lambda x: x <= 10, ROYXAT))}")
# 3. Kesim (bilamiz bo'lsa)
print(f" Kesim: {ROYXAT[:10]}")
# 4. Generator + islice
from itertools import islice
print(f" islice: {list(islice(ROYXAT, 10))}")
print("\n\n=== 2. continue o'rniga ===")
# 1. continue
natija = []
for x in ROYXAT:
if x % 3 != 0:
continue
natija.append(x)
print(f" continue bilan: {natija}")
# 2. Generator ifodasi
print(f" Generator: {[x for x in ROYXAT if x % 3 == 0]}")
# 3. filter
print(f" filter: {list(filter(lambda x: x % 3 == 0, ROYXAT))}")
# 4. filterfalse (teskarisi)
print(f" filterfalse: {list(filterfalse(lambda x: x % 3, ROYXAT))}")
print("\n\n=== 3. Birinchi mos elementni topish ===")
def shart(x):
return x > 15
usullar = {}
# break bilan
for x in ROYXAT:
if shart(x):
usullar["break + else"] = x
break
else:
usullar["break + else"] = None
# next bilan
usullar["next()"] = next((x for x in ROYXAT if shart(x)), None)
# filter + next
usullar["filter + next"] = next(filter(shart, ROYXAT), None)
# dropwhile
usullar["dropwhile"] = next(dropwhile(lambda x: not shart(x), ROYXAT), None)
for nom, natija in usullar.items():
print(f" {nom:<20} → {natija}")
print("\n ⭐ next((x for x in y if c), None) — eng idiomatik")
print("\n\n=== 4. Funksiyada return ===")
def topish_break(royxat, shart):
"""break + else bilan."""
for x in royxat:
if shart(x):
return x
return None
def topish_next(royxat, shart):
"""next bilan."""
return next((x for x in royxat if shart(x)), None)
print(f" topish_break: {topish_break(ROYXAT, shart)}")
print(f" topish_next: {topish_next(ROYXAT, shart)}")
print("\n Funksiyada `return` — `break` va `else` ni almashtiradi")
print("\n\n=== 5. Tezlik ===")
N = 2_000_000
katta = list(range(N))
qidiruv = N - 1
usullar = []
# break
boshlandi = time.perf_counter()
for x in katta:
if x == qidiruv:
n1 = x
break
usullar.append(("for + break", time.perf_counter() - boshlandi))
# next + generator
boshlandi = time.perf_counter()
n2 = next((x for x in katta if x == qidiruv), None)
usullar.append(("next + generator", time.perf_counter() - boshlandi))
# in
boshlandi = time.perf_counter()
n3 = qidiruv if qidiruv in katta else None
usullar.append(("in operatori", time.perf_counter() - boshlandi))
# index
boshlandi = time.perf_counter()
n4 = katta[katta.index(qidiruv)]
usullar.append((".index()", time.perf_counter() - boshlandi))
assert n1 == n2 == n3 == n4
eng_tez = min(v for _, v in usullar)
print(f" {len(katta):,} elementli ro'yxatda oxirgi elementni topish:\n")
print(f" {'Usul':<20} {'Vaqt':>9} {'Nisbat':>8}")
print(" " + "─" * 40)
for nom, vaqt in sorted(usullar, key=lambda x: x[1]):
print(f" {nom:<20} {vaqt * 1000:>6.1f} ms {vaqt / eng_tez:>7.1f}x")
print("\n ⭐ in va .index() — C darajasida, shuning uchun tezroq")
print("\n\n=== 6. Filtrlash tezligi ===")
boshlandi = time.perf_counter()
jami1 = 0
for x in katta:
if x % 2:
continue
jami1 += x
vaqt_continue = time.perf_counter() - boshlandi
boshlandi = time.perf_counter()
jami2 = sum(x for x in katta if x % 2 == 0)
vaqt_gen = time.perf_counter() - boshlandi
boshlandi = time.perf_counter()
jami3 = sum(filter(lambda x: x % 2 == 0, katta))
vaqt_filter = time.perf_counter() - boshlandi
assert jami1 == jami2 == jami3
print(f" {'Usul':<24} {'Vaqt':>9}")
print(" " + "─" * 36)
print(f" {'for + continue':<24} {vaqt_continue * 1000:>6.1f} ms")
print(f" {'sum(generator)':<24} {vaqt_gen * 1000:>6.1f} ms")
print(f" {'sum(filter + lambda)':<24} {vaqt_filter * 1000:>6.1f} ms")
print("\n\n=== 7. Qaror jadvali ===")
print(f"""
{'Vaziyat':<36} {'Yechim'}
{'─' * 66}
{'Birinchi mos elementni topish':<36} next((x for x in y if c), None)
{'Barcha mos keladimi':<36} all(c(x) for x in y)
{'Kamida bittasi':<36} any(c(x) for x in y)
{'Filtrlash':<36} [x for x in y if c(x)]
{'Shartgacha olish':<36} takewhile(c, y)
{'Shartdan keyin':<36} dropwhile(c, y)
{'Element bormi':<36} x in y
{'Indeks topish':<36} y.index(x)
{'Murakkab tekshiruvlar zanjiri':<36} continue
{'Qayta urinish':<36} for + break + else
{'Ichma-ich sikldan chiqish':<36} funksiya + return
""")Natijaning muhim qismi:
=== 5. Tezlik ===
2,000,000 elementli ro'yxatda oxirgi elementni topish:
Usul Vaqt Nisbat
────────────────────────────────────────
in operatori 14.2 ms 1.0x
.index() 15.8 ms 1.1x
for + break 58.4 ms 4.1x
next + generator 72.3 ms 5.1x
⭐ in va .index() — C darajasida, shuning uchun tezroq
=== 6. Filtrlash tezligi ===
Usul Vaqt
────────────────────────────────────
for + continue 98.4 ms
sum(generator) 87.2 ms
sum(filter + lambda) 134.7 msNima ko'rsatdi: 2.8, 2.9-bo'limlar.
Misol 4 — Amaliy: log tahlilchisi
"""break, continue va else — real vazifada."""
from dataclasses import dataclass
from datetime import datetime
LOG = """\
2026-09-08 10:00:12 INFO [api] Server ishga tushdi
2026-09-08 10:00:45 INFO [db] Ulanish o'rnatildi
# Bu izoh qatori
2026-09-08 10:01:03 WARN [api] Sekin so'rov: /users (1250ms)
NOTO'G'RI QATOR FORMATI
2026-09-08 10:01:15 ERROR [db] Ulanish uzildi: timeout
2026-09-08 10:01:16 INFO [db] Qayta ulanmoqda
2026-09-08 10:01:18 INFO [db] Ulanish tiklandi
2026-09-08 10:02:30 ERROR [api] 500 xatosi: /orders
2026-09-08 10:03:01 WARN [cache] Kesh to'ldi
2026-09-08 10:05:22 FATAL [api] Kritik xato — to'xtatish
2026-09-08 10:05:23 INFO [api] Bu qator o'qilmaydi
"""
@dataclass
class Yozuv:
sana: str
vaqt: str
daraja: str
modul: str
xabar: str
DARAJALAR = {"DEBUG", "INFO", "WARN", "ERROR", "FATAL"}
def qatorni_tahlil(qator: str) -> Yozuv | None:
"""Log qatorini tahlil qiladi. Noto'g'ri format bo'lsa None."""
qismlar = qator.split(maxsplit=4)
if len(qismlar) < 5:
return None
sana, vaqt, daraja, modul, xabar = qismlar
if daraja not in DARAJALAR:
return None
if not (modul.startswith("[") and modul.endswith("]")):
return None
return Yozuv(sana, vaqt, daraja, modul[1:-1], xabar)
print("=== 1. continue — filtrlash ===")
yozuvlar = []
otkazildi = {"bo'sh": 0, "izoh": 0, "noto'g'ri": 0}
for raqam, qator in enumerate(LOG.splitlines(), 1):
# Qo'riqchi shartlar — continue bilan
if not qator.strip():
otkazildi["bo'sh"] += 1
continue
if qator.strip().startswith("#"):
otkazildi["izoh"] += 1
continue
yozuv = qatorni_tahlil(qator)
if yozuv is None:
otkazildi["noto'g'ri"] += 1
print(f" ⚠️ {raqam}-qator: noto'g'ri format — {qator[:40]!r}")
continue
yozuvlar.append(yozuv)
print(f"\n O'qildi: {len(yozuvlar)} yozuv")
for sabab, soni in otkazildi.items():
if soni:
print(f" O'tkazildi: {soni} ta ({sabab})")
print("\n\n=== 2. break — FATAL da to'xtash ===")
ishlangan = 0
for yozuv in yozuvlar:
if yozuv.daraja == "FATAL":
print(f" 🔴 {yozuv.vaqt} FATAL — to'xtatildi")
break
ishlangan += 1
else:
print(" ✅ FATAL topilmadi — barcha yozuv ishlandi")
print(f" Ishlangan: {ishlangan}/{len(yozuvlar)}")
print("\n\n=== 3. else — birinchi xatoni topish ===")
for yozuv in yozuvlar:
if yozuv.daraja in {"ERROR", "FATAL"}:
print(f" Birinchi xato: {yozuv.vaqt} [{yozuv.modul}] {yozuv.xabar}")
break
else:
print(" ✅ Hech qanday xato yo'q")
print("\n\n=== 4. next() bilan — alternativa ===")
birinchi_xato = next(
(y for y in yozuvlar if y.daraja in {"ERROR", "FATAL"}),
None
)
if birinchi_xato:
print(f" next() bilan: {birinchi_xato.vaqt} {birinchi_xato.xabar}")
else:
print(" ✅ Xato yo'q")
print("\n\n=== 5. Ketma-ket xatolarni topish ===")
MAX_KETMA_KET = 2
ketma_ket = 0
muammoli_modullar = set()
for yozuv in yozuvlar:
if yozuv.daraja in {"ERROR", "FATAL"}:
ketma_ket += 1
muammoli_modullar.add(yozuv.modul)
if ketma_ket >= MAX_KETMA_KET:
print(f" 🔴 {MAX_KETMA_KET} ta ketma-ket xato!")
print(f" Modullar: {sorted(muammoli_modullar)}")
break
else:
ketma_ket = 0
muammoli_modullar.clear()
else:
print(f" ✅ {MAX_KETMA_KET} ta ketma-ket xato topilmadi")
print("\n\n=== 6. Statistika ===")
from collections import Counter
darajalar = Counter(y.daraja for y in yozuvlar)
modullar = Counter(y.modul for y in yozuvlar)
print(" Darajalar:")
BELGILAR = {"INFO": "ℹ️ ", "WARN": "⚠️ ", "ERROR": "❌", "FATAL": "🔴"}
for daraja in ["INFO", "WARN", "ERROR", "FATAL"]:
soni = darajalar.get(daraja, 0)
if soni:
chiziq = "█" * soni
print(f" {BELGILAR[daraja]} {daraja:<6} {soni:>2} {chiziq}")
print("\n Modullar:")
for modul, soni in modullar.most_common():
print(f" [{modul}]{'':<{8 - len(modul)}} {soni}")
print("\n\n=== 7. Vaqt oralig'ida qidirish ===")
BOSHLANISH = "10:01:00"
TUGASH = "10:02:00"
print(f" Oraliq: {BOSHLANISH} — {TUGASH}\n")
topilgan = 0
for yozuv in yozuvlar:
if yozuv.vaqt < BOSHLANISH:
continue # hali erta
if yozuv.vaqt > TUGASH:
break # oraliqdan chiqdik (log tartiblangan)
topilgan += 1
print(f" {yozuv.vaqt} {yozuv.daraja:<6} [{yozuv.modul}] {yozuv.xabar}")
if not topilgan:
print(" (oraliqda yozuv yo'q)")
print(f"\n ⭐ continue — 'hali erta', break — 'kech bo'ldi'")
print(" Log tartiblangan bo'lgani uchun break xavfsiz")Natijaning muhim qismi:
=== 1. continue — filtrlash ===
⚠️ 6-qator: noto'g'ri format — "NOTO'G'RI QATOR FORMATI"
O'qildi: 10 yozuv
O'tkazildi: 1 ta (bo'sh)
O'tkazildi: 1 ta (izoh)
O'tkazildi: 1 ta (noto'g'ri)
=== 2. break — FATAL da to'xtash ===
🔴 10:05:22 FATAL — to'xtatildi
Ishlangan: 8/10
=== 5. Ketma-ket xatolarni topish ===
✅ 2 ta ketma-ket xato topilmadi
=== 7. Vaqt oralig'ida qidirish ===
Oraliq: 10:01:00 — 10:02:00
10:01:03 WARN [api] Sekin so'rov: /users (1250ms)
10:01:15 ERROR [db] Ulanish uzildi: timeout
10:01:16 INFO [db] Qayta ulanmoqda
10:01:18 INFO [db] Ulanish tiklandi
⭐ continue — 'hali erta', break — 'kech bo'ldi'
Log tartiblangan bo'lgani uchun break xavfsizNima ko'rsatdi: 2.2, 2.3, 2.4-bo'limlar amaliyotda.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
"break barcha sikldan chiqadi" |
Faqat eng yaqin sikldan |
"Pythonda break label bor" |
Yo'q. Funksiya + return ishlating |
"continue while da xavfsiz" |
O'zgarishni o'tkazsa — cheksiz sikl |
"else — 'aks holda'" |
"nobreak" — break bo'lmasa |
"return bo'lsa else bajariladi" |
Yo'q — return funksiyadan chiqadi |
"for/else ko'p kerak" |
Kam. any, all, next aniqroq |
"break resurs tozalaydi" |
Yo'q — with yoki finally kerak |
"break next() dan tez" |
Odatda in/.index() eng tez |
6. Keng tarqalgan xatolar va yechimlari
1. while + continue — cheksiz sikl
while i < n:
if shart:
continue # ❌ i o'zgarmadi
i += 1
while i < n:
i += 1 # ✅ oldin
if shart:
continue2. Ichma-ich break
for i in ...:
for j in ...:
if shart:
break # ⚠️ faqat ichki
# ✅ Funksiya + return
def topish():
for i in ...:
for j in ...:
if shart:
return i, j
return None3. break va resurs
for x in y:
f = open(...)
if shart:
break # ❌ fayl yopilmadi
for x in y:
with open(...) as f: # ✅
if shart:
break4. else ni noto'g'ri tushunish
for x in y:
...
else:
# ⚠️ Bu "sikl tugagach" emas
# Bu "break bo'lmagach"5. return bilan else
def f():
for x in y:
if c: return x
else: # ⚠️ ortiqcha
return None
def f():
for x in y:
if c: return x
return None # ✅6. break o'rniga generator kerak bo'lganda
for x in y: # ⚠️ uzun
if c(x):
natija = x
break
else:
natija = None
natija = next((x for x in y if c(x)), None) # ✅7. Sikl tanasi bo'sh, faqat continue
for x in y:
if not c(x):
continue # ⚠️ ortiqcha
ishla(x)
for x in filter(c, y): # ✅
ishla(x)8. break generatorda tozalashsiz
def gen():
f = open(...)
for qator in f:
yield qator
f.close() # ❌ break bo'lsa bajarilmaydi
def gen():
with open(...) as f: # ✅
for qator in f:
yield qator7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 5.5, 5.6-darslar (o'tilgan):
whilevafor - 5.11-dars: ichma-ich sikllardan chiqish
- 5.2-dars (o'tilgan): qo'riqchi shart —
continuebilan - 9-qism:
try/finallybilan resurs tozalash - 7, 10, 15-qismlar: generatorlar,
takewhile,dropwhile,filter - 10, 16-qismlar: fayl o'qish,
with - 31-qism: qidiruv algoritmlari
8. Eng yaxshi amaliyotlar
whileda o'zgarishnicontinuedan oldin qo'ying. Bu — cheksiz siklning eng ko'p sababi.breako'rniganext()yoki funksiya +return. Qisqaroq va aniqroq.continueni qo'riqchi shart sifatida ishlating. Chekinishni tekis saqlaydi.for/elsega izoh yozing. Ko'p dasturchi uni bilmaydi.any/all/nextni afzal ko'ring.for/elsedan aniqroq.breakbilan resursniwithichida saqlang. Aks holda oqadi.Ichma-ich sikldan chiqish uchun funksiya ishlating.
breakfaqat bir daraja.Katta ro'yxatda
in/.index()ishlating. Ular C darajasida — tezroq.
9. Amaliy topshiriq
Vazifa 1: Natijani bashorat qiling
# a
for x in [1,2,3]:
if x == 2: break
else:
print("else")
print("oxiri")
# b
for x in []:
print(x)
else:
print("else")
# c
for i in range(2):
for j in range(2):
if j == 0: break
print(i, j)
# d
i = 0
n = 0
while i < 3 and n < 10:
n += 1
if i == 1: continue
i += 1
print(i, n)Javoblar
a. oxiri — else bajarilmadi (break bor)
b. else — bo'sh to'plamda ham bajariladi
c. Hech narsa — j == 0 da darhol break
d. 1 10 — i == 1 da cheksiz sikl (cheklov bilan to'xtadi)
Vazifa 2: Xatolarni tuzatish
1. i = 0
while i < 10:
if i % 2: continue
print(i)
i += 1
2. for x in royxat:
f = open(x)
if shart: break
f.close()
3. for i in range(3):
for j in range(3):
if jadval[i][j] == q:
break
# tashqi sikldan ham chiqish kerak
4. def f(royxat):
for x in royxat:
if c(x): return x
else:
return NoneJavoblar
1. i = 0
while i < 10:
i += 1 # oldin
if i % 2: continue
print(i)
2. for x in royxat:
with open(x) as f:
if shart: break
3. def topish(jadval, q):
for i in range(3):
for j in range(3):
if jadval[i][j] == q:
return i, j
return None
4. def f(royxat):
for x in royxat:
if c(x): return x
return NoneVazifa 3: for/else ni almashtiring
1. for x in royxat:
if x > 10: break
else:
print("Topilmadi")
2. for x in royxat:
if not shart(x):
hammasi = False
break
else:
hammasi = True
3. for i, x in enumerate(royxat):
if x == q: break
else:
i = -1Javoblar
1. if not any(x > 10 for x in royxat): print("Topilmadi")
2. hammasi = all(shart(x) for x in royxat)
3. i = next((i for i, x in enumerate(royxat) if x == q), -1)Vazifa 4: Log tahlilchisi
4-misoldagi dasturni kengaytiring:
- Vaqt oralig'ini parametr qiling
- Daraja bo'yicha filtrlash
- Ketma-ket xatolar chegarasini sozlanadigan qiling
FATALdan keyin nechta qator o'tkazib yuborilganini hisoblang
Vazifa 5: Qidiruv kutubxonasi
Funksiyalar yozing (har birini ikki usulda — break/else va next/any):
birinchi(royxat, shart)— birinchi mos elementbirinchi_indeks(royxat, shart)oxirgi(royxat, shart)barchasi_mos(royxat, shart)nechta(royxat, shart)
Vazifa 6: Menyu tizimi
while True + break bilan menyu yozing:
- Ichma-ich menyular (
continuebilan orqaga qaytish) - Noto'g'ri tanlovda
continue chiqishda barcha darajadanbreak- Tasdiqlash so'rovi
Vazifa 7: O'ylash
Nega Pythonda break label (yorliqli break) yo'q?
Javob
Guido van Rossum uni bir necha marta rad etgan (PEP 3136, 2007).
Sabablari:
1. Kam kerak.
Statistika: yorliqli break kerak bo'lgan holatlar juda kam — asosan ikki-uch qavatli ichma-ich sikllarda.
2. Alternativa bor va u yaxshiroq.
# Yorliq o'rniga — funksiya
def topish(jadval, q):
for i, qator in enumerate(jadval):
for j, x in enumerate(qator):
if x == q:
return i, j
return NoneBu — aniqroq: funksiya nomi maqsadni bildiradi va natija qaytariladi.
3. Sintaksis murakkablashadi.
Yorliq yangi kalit so'z yoki maxsus sintaksis talab qiladi. Python soddalikni afzal ko'radi (1.5-dars).
4. Chuqur ichma-ich — dizayn muammosi belgisi.
Uch qavatli ichma-ich sikl odatda kodni bo'lish kerakligini ko'rsatadi. Yorliqli break bu muammoni yashiradi, hal qilmaydi.
Boshqa tillar:
| Til | Yorliqli break |
|---|---|
| Java, JavaScript | bor |
| C, C++ | (goto bor) |
| Go | bor |
| Rust | bor ('label: loop) |
| Python | yo'q |
Pythondagi yechimlar (11-darsda batafsil):
# 1. Funksiya + return ← eng yaxshi
# 2. Bayroq o'zgaruvchisi
# 3. itertools.product
# 4. Istisno (kam holatda)Nimani mustahkamlaydi: 2.1, 2.2, 2.3, 2.5, 2.8-bo'limlar.
Xulosa
Bu darsda sikl oqimini boshqarishni o'rgandik.
Eng muhim uch fikr:
whiledacontinue— cheksiz sikl xavfi. O'zgarishnicontinuedan oldin qo'ying.forda bunday muammo yo'q.else— "nobreak" degani. U siklbreaksiz tugaganda bajariladi. Nomi chalkash, shuning uchun izoh yozing — yokiany/all/nextni ishlating, ular ko'pincha aniqroq.breakfaqat eng yaqin sikldan chiqadi. Pythonda yorliqlibreakyo'q — ichma-ich sikldan chiqish uchun funksiya vareturnishlating.
Keyingi darsda ichma-ich sikllar va murakkablikni o'rganamiz: qanday qilib ularni tekislash, algoritmik murakkablik va itertools bilan almashtirish.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!