Isoqjanov Ilyos | Python
512 subscribers
34 photos
13 videos
2 files
60 links
🐍 Python bo'yicha o'zbek tilidagi sifatli materiallarni ko'paytirishda o'zing madadkor bo'lgin Allohim.

Shaxsiy blogim:
https://t.me/coldboot_blog

Admin:
@JurabekAbdusattarov,
@pythonwithcoldboot
Download Telegram
🪄 Python Magiyasi #1

Kodga qarang 👇
print(True + True + False)


🤔 Sizningcha, bu kodning natijasi nima chiqadi? Javoblaringizni izohlarda kutib qolamiz!
1
🎯 FastStream — Pythonda asinxron xabar almashish (message broker) uchun qulay freymvork

FastStream yordamida Kafka, RabbitMQ yoki Redis bilan producer / consumer (ya’ni yuboruvchi va qabul qiluvchi) kod yozish juda oson bo‘ladi.

🧩 O‘rnatish:
# faqat asosiy qismi
pip install faststream

# RabbitMQ uchun:
pip install "faststream[rabbit]"

# Kafka uchun:
pip install "faststream[kafka]"


⚙️ Oddiy misol (RabbitMQ bilan):
from faststream import FastStream
from faststream.rabbit import RabbitBroker

broker = RabbitBroker("amqp://guest:guest@localhost:5672/")
app = FastStream(broker)

@broker.subscriber("hello")
async def handle(msg):
print("📩 Qabul qilindi:", msg)

@app.after_startup
async def send():
await broker.publish("Salom FastStream!", "hello")


🏃 Ishga tushirish:
faststream run app:app


🔹 Bu kod RabbitMQ orqali xabar yuboradi va shu zahoti uni qayta o‘qib, ekranga chiqaradi.
🔹 Asinxron ishlaydi (async/await), Pydantic bilan validatsiya ham qo‘llab-quvvatlanadi.

💡 Qisqacha:
FastStream — bu FastAPI singari, lekin xabar brokerlari uchun.
U mikroxizmatlar orasida tez, typed va oson aloqa o‘rnatish imkonini beradi.
🪄 Python Magic #2

📜 Kod parcha:
a = [1, 2, 3]
b = a
a.append(4)
print(b)


Savol: Natija nima chiqadi?
🎯 Javobni izohlarda yozing 👇
🧐 Nima uchun shunday chiqadi deb o‘ylaysiz?
Bir obyektmi yoki yangi nusxami? Pythonda aniqlab olaylik

Ko‘p odamlarni chalkashtiradigan mavzu — a = b bilan .copy() yoki deepcopy() o‘rtasidagi farq.

🔹 1. = — bu havola
a = [1, 2, 3]
b = a
a.append(4)
print(b) # [1, 2, 3, 4]


➡️ bu yerda b yangi ro‘yxat emas. Ikkalasi bir obyektga qaraydi (ikkalasi ham bitta obyekt).
Shuning uchun a o‘zgarsa, b ham o‘zgaradi.

🔹 2. .copy() — 1-darajali (shallow) nusxa
a = [[1, 2, 3]]
b = a.copy()
a[0].append(4)
print(b) # [[1, 2, 3, 4]]


➡️ bu funksiya eng tashqi qavatdan yangi nusxa oladi lekin agar ichki qavatlarda obyekt bo'lsa,
undan havola orqali foydalanadi. Demak, nested (ichma-ich) strukturada bu ham xavfli.

🔹 3. copy.deepcopy() — to‘liq mustaqil nusxa
import copy
a = [[1, 2, 3]]
b = copy.deepcopy(a)
a[0].append(4)
print(b) # [[1, 2, 3]]


➡️ Barcha ichki obyektlar ham yangi yaratiladi.
a o‘zgarsa, b o‘zgarmaydi

🔹 4. += vs = a + [...]
a = [1, 2, 3]
b = a
a += [4] # joyida o‘zgartiradi
a = a + [5] # yangi obyekt yaratadi


➡️ += obyektni joyida o‘zgartiradi,
a = a + [...] esa yangi obyekt qiladi.

💡 Xulosa:

• = — havola beradi.
• .copy() — sirtqi nusxa.
• copy.deepcopy() — to‘liq nusxa (deep).
• In-place amallar (+=, .append()) — asl obyektni o‘zgartiradi.
👍21🔥1
🧠 Pythonda Falsy va Truthy tushunchalari

Dasturlashda har bir obyekt mantiqiy qiymat (bool() orqali) baholanishi mumkin.
Pythonda har qanday obyekt mantiqiy True yoki False qiymatlardan biri sifatida olinishi mumkin.
Shu asosda obyektlar ikki turga bo‘linadi 👇

1. 🔹 Truthy — “rost” qiymatlar

if yoki while shartlarida True deb baholanadi.

Masalan:
if "Hello":
print("Truthy!") #

2. 🔸 Falsy — “yolg‘on” qiymatlar

if yoki while shartlarida False deb baholanadi.

Masalan:
if "":
print("Bu chiqmaydi ")


🧾 Pythonda Falsy qiymatlar ro‘yxati:

False - Mantiqan yolg‘on
None - Hech qanday qiymat yo‘q
0, 0.0, 0j - Nol
'' - Bo‘sh string
[] - Bo‘sh ro‘yxat
{} - Bo‘sh lug‘at
set() - Bo‘sh to‘plam
() - Bo‘sh tuple
range(0) - Bo‘sh diapazon

💡 Misol:
values = [None, 0, '', [], {}, set(), False, [1, 2]]

for v in values:
if v:
print(f"{v} → Truthy ")
else:
print(f"{v} → Falsy ")


Natija:
None → Falsy 
0 → Falsy
→ Falsy
[] → Falsy
{} → Falsy
set() → Falsy
False → Falsy
[1, 2] → Truthy

🧩 Xulosa:

• Falsy — bool(value) → False
• Truthy — bool(value) → True

Shuning uchun shartlarda (if, while) bevosita obyektning o‘zini tekshirish kifoya:
if my_list:  # Bo‘sh emasmi?
print("Ma'lumot bor ")


🧠 Kichik sir:
Ko‘p hollarda if something: yoki if not something: deb yozish —
if len(something) > 0: yozishdan ancha “pythonic” hisoblanadi 🐍
1👍1🔥1
📌 Python kutubxonasi: Emot
🔍 Emodzilarni aniqlash va tahlil qilish

Matndagi emoji va emotikonlarni avtomatik aniqlash kerakmi? Unda Emot kutubxonasi aynan siz uchun!

🛠 Emot nima qiladi?
Bu kutubxona Python dasturlaringizda matndan emodzilarni topish, ularni o‘rganish yoki kerak bo‘lsa olib tashlash imkonini beradi.

💡 Qachon foydali?

• Matnli ma’lumotlarni tozalashda (preprocessing)
• NLP (Natural Language Processing) loyihalarida
• Emodzilarning semantikaga ta’sirini o‘rganishda

📥 Foydalanish juda oddiy:
from emot import emot

text = "Bugun kayfiyat ajoyib 😄🔥"
result = emot().emoji(text)
print(result)


📌 Natijada sizga emodzilar ro‘yxati va ularning pozitsiyasi bilan lug‘at qaytariladi.

{'value': ['😄', '🔥'], 'location': [[22, 23], [23, 24]], 'mean': [':grinning_face_with_smiling_eyes:', ':fire:'], 'flag': True}


o'rnatish:
pip install emot
1👍1🔥1
🧠 response.get("object", []) vs response.get("object") or [] farqi

Pythonda dict.get() metodidan foydalanayotganda bu ikki yozuv o‘xshash ko‘rinsa ham, asosan None qiymatlarda farq qiladi.

🔹 Misol:
response = {"object": None}

print(response.get("object", [])) # ➜ None 😬
print(response.get("object") or []) # ➜ []


🔍 Nima bo‘ldi?
1) .get("object", [])
• agar kalit ("object") yo'q bo'lsa - [] qaytaradi
• agar kalit bor lekin qiymati None bo'lsa - None qaytaradi
• agar kalit bor va qiymati [] bo'lsa - [] qaytaradi
• agar kalit bor va qiymati [1,2] bo'lsa - [1,2] qaytaradi

2) .get("object") or []
• agar kalit ("object") yo'q bo'lsa - [] qaytaradi
• agar kalit bor lekin qiymati None bo'lsa - [] qaytaradi
• agar kalit bor va qiymati [] bo'lsa - [] qaytaradi
• agar kalit bor va qiymati [1,2] bo'lsa - [1,2] qaytaradi

💡 Xulosa:
• Agar serverdan kelgan javobda "object" kaliti bo‘lishi ham, qiymati None bo‘lishi ham mumkin bo‘lsa,
response.get("object") or [] — xavfsizroq variant

Shunda for item in response.get("object") or []: deb bemalol yozsangiz,
hech qachon TypeError: 'NoneType' object is not iterable xatosi chiqmaydi 😉


🧩 Esda tuting:
.get("key", default) — faqat kalit yo‘q bo‘lganda default qaytaradi,
• .get("key") or default esa kalit mavjud lekin qiymati falsy (None, [], "", 0) bo‘lsa ham defaultni qaytaradi.
1👍1🔥1
SOLID nima?

SOLID — bu obyektga yo‘naltirilgan dasturlash (OOP) da yaxshi arxitektura yaratish uchun ishlatiladigan beshta asosiy prinsip to‘plami.

SOLID so‘zining har bir harfi quyidagilarni anglatadi:

• S Single Responsibility Principle
• OOpen/Closed Principle
• L Liskov Substitution Principle
• I Interface Segregation Principle
• DDependency Inversion Principle

Keyingi 5 ta postda sizlar bilan yuqoridagi 5 ta prinsip va ularning nega muhimligi haqida gaplashamiz.
Bugun biz S — Single Responsibility Principle ni to‘liq ko‘rib chiqamiz.
1👍1🔥1
🎯1. Single Responsibility Principle (SRP) ta’rifi

Robert C. Martin (Uncle Bob) quyidagicha ta’rif bergan:

“A class should have only one reason to change.”
Ya’ni: Har bir klass faqat bitta sababga ko‘ra o‘zgarishi kerak.


💡 2. Oddiy so‘zlar bilan

Biror klass (yoki modul, funksional bo‘lim) faqat bitta vazifani bajarishi kerak.
Agar bitta klass bir nechta vazifa bajarayotgan bo‘lsa — bu SRP ga zid.

📦 3. Misol (SRP buzilgan holat)

Faraz qilaylik, bizda Report nomli klass bor va u hisobot bilan bog'liq bo'lgan barcha ishni bajaryapti:
class Report:
def __init__(self, data):
self.data = data

def calculate_statistics(self):
# Hisobot uchun statistika hisoblash
return sum(self.data) / len(self.data)

def print_report(self):
# Natijani konsolga chiqarish
print(f"Report: {self.calculate_statistics()}")

def save_to_file(self, filename):
# Hisobotni faylga yozish
with open(filename, 'w') as f:
f.write(str(self.calculate_statistics()))

Bu yerda Report klassi:
• Statistika hisoblayapti
• Natijani chop etayapti
• Faylga saqlayapti

👉 Demak, bu klass 3 xil sababga ko‘ra o‘zgarishi mumkin, chunki u 3 ta vazifani bajaryapti:
• Hisoblash usuli o‘zgarsa
• Natijani chiqarish formati o‘zgarsa
• Faylga yozish usuli o‘zgarsa

Bu SRP ni buzadi.

Bu holatdagi muammo shundaki, yuqoridagi 3 ta vazifadan (hisoblash, natijani chiqarish va faylga yozish) qaysidir biri o'zgarsa bo'lgani, biz butun klashni o'zgartirishga majbur bo'lamiz. Bu esa dastur kattalashgan sari qiyinlashib boradi va chalkashliklarni ko'paytiradi.

4. To‘g‘rilangan SRP varianti
Yuqoridagi Report klassini har bir vazifasi uchun alohida klass yozamiz va 3 ta klassga ajratamiz:

class ReportData:
def __init__(self, data):
self.data = data

def calculate_statistics(self):
return sum(self.data) / len(self.data)


class ReportPrinter:
def print_report(self, statistics):
print(f"Report: {statistics}")


class ReportSaver:
def save_to_file(self, statistics, filename):
with open(filename, 'w') as f:
f.write(str(statistics))


Endi nima o'zgardi:
• ReportData — faqat hisoblash uchun mas’ul
• ReportPrinter — faqat chiqarish uchun mas’ul
• ReportSaver — faqat saqlash uchun mas’ul

👉 Har biri bitta sabab bilan o‘zgaradi. Ya'ni qaysi vazifa o'zgarsa o'sha vazifani bajaradigan klassni o'zgartiramiz xalos.

🧩5. Nega bu muhim?

Afzalliklari:
• Kod tushunarli va qo‘llab-quvvatlash oson
• Testlash oson (har bir klass alohida test qilinadi)
• O‘zgarishlar boshqa qismga ta’sir qilmaydi
• Qayta foydalanish oson

Bu afzalliklar kichik loyihalarda bilinmasligi mumkin lekin katta loyihalar qilsangiz, tilla tanga topgandek bo'lasiz🔥.

⚠️ 6. Real hayotdagi o‘xshatish

Tasavvur qiling, sizning kafeyingizda bir inson bor:
• Ham oshpaz 🍳
• Ham ofitsiant 🍽
• Ham buxgalter 💰

Bu inson ishini o‘zgartirmoqchi bo‘lsa (masalan, yangi retsept qo‘shmoqchi bo‘lsa), u boshqa rollarini ham o‘zgartirishga majbur bo‘ladi.
Yaxshisi, har bir ishni alohida mutaxassis bajarishi kerak — bu SRP!

🧠 7. Yakuniy xulosa

Single Responsibility Principle — bu “bitta klass — bitta mas’uliyat” degan tamoyil.
🔹 Har bir klass bitta ishni bajarsin.
🔹 Agar klass bir nechta sabab bilan o‘zgarishi mumkin bo‘lsa, uni bo‘lish kerak.
🔹 Natijada kod modulli, testlanadigan, va barqaror bo‘ladi.
1👍1🔥1
🎯 #SOLID2️⃣ OCP: Open/Closed Principle

🔹 “Kod kengaytirishga ochiq, lekin o‘zgartirishga yopiq bo‘lishi kerak.”
Bu prinsip shuni anglatadiki — agar tizimga yangi xatti-harakat (funksiya, qoidalar, logika) qo‘shmoqchi bo‘lsak, mavjud kodni o‘zgartirmasdan kengaytirishimiz kerak

💡 Oddiy tushuntirish:

Tasavvur qiling — sizda Shape klassi bor, va siz doira ham, to‘g‘ri to‘rtburchak ham chizmoqchisiz 🟠🟩
Agar siz draw() funksiyasida if-else orqali shaklni ajratsangiz — yangi shakl qo‘shganingizda eski kodni ham o‘zgartirasiz
Bu OCPga zid.

Yomon yechim (OCP buzilgan):
class ShapeDrawer:
def draw(self, shape_type):
if shape_type == "circle":
print("Chizilyapti: doira")
elif shape_type == "square":
print("Chizilyapti: kvadrat")


➡️ Yangi shakl qo‘shmoqchimisiz?
Demak ifga yana shart qo‘shasiz. Bu — mavjud kodni o‘zgartirish degani 😬

To‘g‘ri yechim (OCPga mos):
class Shape:
def draw(self):
pass

class Circle(Shape):
def draw(self):
print("Chizilyapti: doira")

class Square(Shape):
def draw(self):
print("Chizilyapti: kvadrat")

def render(shape: Shape):
shape.draw()


Endi yangi shakl qo‘shmoqchimisiz?
Fakat yangi klass yozasiz, eski kodni o'zgartirishingizga xojat yo'q🔥

📘 Xulosa:

Yangi funksionallik qo‘shish — o‘zgartirishsiz kengaytirish orqali bo‘lishi kerak
Eski kodni tahrir qilish — xatolik xavfini oshiradi
🔹 OCP — kodni barqaror va kengaytiriladigan qiladi


🧱 SOLID #2 — OCP (Open/Closed Principle)
"Be open for extension, but closed for modification."
1👍1🔥1
📌 Python darsi: insort() — tartibni buzmasdan qo‘shish!

Ko‘p hollarda bizda tartiblangan ro‘yxat bo‘ladi, va biz unga yangi element qo‘shmoqchimiz.
Ammo append() yoki insert() dan foydalansak — tartib buziladi, keyin yana sort() qilishga to‘g‘ri keladi 😩

Shunda yordamga bisect.insort() keladi 🚀

🧩 Misol:
from bisect import insort

numbers = [1, 3, 5, 7]
insort(numbers, 4)
print(numbers)


🟢 Natija:
[1, 3, 4, 5, 7]


➡️ insort() — yangi elementni ro‘yxat ichidagi to‘g‘ri joyiga joylashtiradi.
Ya’ni ro‘yxat tartiblangan holatda qoladi, sort() chaqirish shart emas

📚 Qisqacha tushuncha:
insort(list, element) — elementni joylashtiradi (ro‘yxat tartibini saqlaydi)
bisect_left() va bisect_right() esa qaysi joyga joylashtirish kerakligini topadi.

⚙️ Yana bir misol:
from bisect import bisect_left, insort

nums = [1, 2, 4, 5]
pos = bisect_left(nums, 3)
print(pos) # 2

insort(nums, 3)
print(nums) # [1, 2, 3, 4, 5]


💡 Afzalligi:
• Har safar sort() chaqirishga hojat yo‘q
• insort — O(n) vaqt oladi, sort() esa O(n log n)
• Kichik, lekin samarali optimizatsiya 🔥

#️⃣ Xulosa:
• insort() — bu ro‘yxatni qayta sort qilmasdan, yangi elementni tartibga mos joyga qo‘shishning eng toza yo‘li 🧠

🧵 Modul: bisect
🔍 Funktsiya: insort(list, value)
⚡️ Ishlatish: from bisect import insort
🔥43👍1🎉1
📘 #Python | Walrus operatori (:=)

Python 3.8 versiyasidan boshlab yangi operator — walrus operatori (:=) paydo bo‘lgan.
U orqali biz biror o‘zgaruvchiga qiymat berish va shu qiymatdan darhol foydalanish imkoniga egamiz 😎

🔹 Oddiy holat
x = int(input("Son kiriting: "))
natija = x + x**2
print(natija)

Bu yerda avval x ga qiymat beramiz, keyin undan alohida foydalanamiz.

🔹 Walrus operatori bilan
natija = (x := int(input("Son kiriting: "))) + x**2
print(natija)


Bu ifoda bir qatorning o‘zida:
1. int(input()) orqali foydalanuvchi kiritgan sonni oladi,
2. shu qiymatni x ga yozadi,
3. va shu qiymatdan yana ifoda ichida foydalanadi (x**2 qismida).

🔍 Misol: agar foydalanuvchi 5 kiritsa,
(x := 5) → x = 5 bo‘ladi,
so‘ng 5 + 5**2 = 30 chiqadi.


🔹 Yana bir misol (ko‘p ishlatiladigan holat)
# 0 kiritilgunga qadar sonlarni yig‘ish
total = 0
while (x := int(input("Son kiriting (0 - stop): "))) != 0:
total += x

print("Yig‘indi:", total)


Bu yerda (x := int(input())) qiymatni oladi, x ga yozadi va while shartida ham foydalanadi — bitta qatorda! 🔁

⚠️ Eslatma:
• Walrus operatori faqat Python 3.8+ versiyalarida ishlaydi.
• Juda foydali, lekin haddan ortiq ishlatish kodingizni o‘qish qiyinlashtirishi mumkin — balansni saqlang 😉

Xulosa:
1. := — qiymatni o‘zgaruvchiga yozish va uni darhol ishlatish imkonini beradi
2. Kodni ixcham, chiroyli va “pythonic” qiladi
3. Ayniqsa while sikllari, shartlar va bitta ifoda ichida hisoblashlarda juda qulay
🔥31👏1😁1
📘 #Python | (A, B)[shart] — noodatiy ifoda

Ba’zan kodingizda shartga qarab 2 xil qiymatdan birini tanlash kerak bo‘ladi.
Masalan:
x = 12
natija = "katta" if x > 10 else "kichik"
print(natija)

Natija: katta

🔹 Lekin buni “hiyla” orqali ham yozish mumkin 😎
x = 12
natija = ("kichik", "katta")[x > 10]
print(natija)


💡 Bu yerda:
• ("kichik", "katta") — tuple
• [x > 10] esa indeks sifatida ishlatiladi (True → 1, False → 0)

Demak:
• agar x > 10 → True → [1] → "katta"
• agar x > 10 → False → [0] → "kichik"

🔍 Yana bir misol:
son = int(input("Son kiriting: "))
natija = ("juft", "toq")[son % 2]
print(natija)

➡️ Foydalanuvchi 7 kiritsa → son % 2 = 1 → "toq"
➡️ Agar 8 kiritsa → son % 2 = 0 → "juft"

⚠️ Lekin ehtiyot bo‘ling:
Garchi (A, B)[shart] ishlasa ham, bu tavsiya etilmaydi

Sabablari:
• Har doim ikkala elementni ham (ya'ni tuple ichidagi element yoki ifodani) hisoblaydi — if else esa faqat keraklisini.
• Kodingizni o‘qish qiyinlashadi.
• Katta loyihalarda bu ifoda chalkashlik keltirib chiqaradi.

To‘g‘ri, toza usul:
natija = "katta" if x > 10 else "kichik"

Bu ancha o‘qilishi oson, “pythonic” va xavfsiz.

Xulosa:
• (A, B)[shart] — shartga qarab 0 yoki 1 indeksni tanlaydi
• Lekin bu faqat “hiyla” sifatida yaxshi, amalda — if ... else ... ishlating 💪
6🔥21👍1
🧪 Dasturlashda testlash nima uchun juda muhim?

Testlash — bu dastur to‘g‘ri ishlayotganini tekshirish jarayoni. U kodni ishonchli, barqaror va xatolarsiz qiladi.

🔹 Nima uchun test yozish kerak?
• Xatolarni erta topadi 🐞
• Kodni o‘zgartirishdan qo‘rqmaysiz 💪
• Loyihani boshqalar ham oson tushunadi 📘
• Tizim ishonchli ishlaydi ⚙️

🔹 Test yozish va qo‘lda (manual) testlash farqi
Test yozish (avtomatik):
• Kod bilan yoziladi, tez bajariladi
• Har safar avtomatik ishlaydi
• Kam xato
• CI/CD tizimiga ulanadi

Qo'lda testlash:
• Inson qo‘lda tekshiradi 👩‍💻
• Har safar qayta bajarish kerak
• Inson xatosi bo‘lishi mumkin
• Mustaqil ishlanadi (CI/CD tizimiga ulanmaydi)

🔹 Kichik va katta loyihalarda farqi
• Kichik loyiha: faqat muhim joylarni testlab qo‘yish ham yetadi.
• Katta loyiha: avtomatlashtirilgan testlarsiz iloji yo‘q — hammasi tizimga ulanadi.

⏱️ Vaqt sarfida avtomatik testlashning foydasi
• Boshlanishida test yozish vaqt oladi, lekin keyin bu vaqtni ko‘p marotaba tejaydi.
• Bir marta yozilgan test — har safar dastur o‘zgarganda siz uchun avtomatik tekshiruvchi bo‘ladi.

Xulosa
• Test yozish — bu kodni tekshirish emas, uni ishonch bilan rivojlantirish uchun asosdir.
• Manual testlash — ko‘rish, his qilish uchun kerak;
• Avtomatik testlar esa — ishonchli ishlash kafolati.

Shunday ekan avtomatik test yozishni o'rganib qo'yavering, axir siz katta-katta loyihalar qilishingiz kerak😄
6👍2👏2🔥1🤔1
🐍 Pythonda Dekorator nima?

Dekorator — bu funksiya bo‘lib, u boshqa funksiyani argument sifatida qabul qiladi va yangi (o‘ralgan) funksiyani qaytaradi. 🎁

Oddiy qilib aytganda — funksiyani bezovchi funksiya 😊

🔹 Misol:
def dekorator(func):
def orovchi():
print("Oldin")
func()
print("Keyin")
return orovchi

@dekorator
def salom():
print("Salom, dunyo!")

salom()


📤 Natija:
Oldin
Salom, dunyo!
Keyin


💡 Dekoratorlardan foydalanish joylari:
🔍 Loglash (funksiya chaqirilganini yozib borish)
⏱️ Vaqt o‘lchash
🔐 Avtorizatsiya tekshiruvi
🧩 Kesh (cache) mexanizmi
🧰 Kod takrorlanishini kamaytirish

🧠 Xulosa:
Dekorator — “funksiyani qabul qilib, funksiya qaytaruvchi funksiya”.
Kodga qo‘shimcha imkoniyat qo‘shish uchun ishlatiladi 🔧

Batafsil ma'lumotni komentariya topishingiz mumkin👇
6👏5👍2🔥1👌1🤓1
📘 #Python | enumerate() vs range(len())
mevalar = ["olma", "banan", "gilos"]

# range(len())
for i in range(len(mevalar)):
print(i, mevalar[i])

# enumerate()
for i, meva in enumerate(mevalar):
print(i, meva)


🔹 enumerate() — indeks va qiymatni birgalikda, xavfsiz va xotira tejamkor tarzda beradi.
🔹 range(len()) — faqat indeks yaratadi; agar ro‘yxat o‘zgarsa IndexError yoki noto‘g‘ri natija chiqishi mumkin.
🔹 Har ikkisi ham “lazy iterator”, ya’ni barcha elementlarni birdaniga xotiraga yuklamaydi.
Lekin:
enumerate() → iteratorni joyida o‘rab oladi, elementlarni bitta-bitta oladi.
range(len()) → len() orqali obyekt uzunligini oldindan hisoblab oladi, bu esa katta iteratorlarda muammo.

🧠 Katta ma’lumot oqimi (masalan 10¹⁸ element) misolida:
range(len(iterator)) — len() butun iteratorni sanab chiqadi → xotira to‘ladi yoki ishlamaydi.
enumerate(iterator) — elementlarni lazy tarzda qaytaradi → ishlaydi, xotira sarfi minimal.

enumerate() → toza, tez, xavfsiz, katta oqimlar uchun mos
⚠️ range(len()) → faqat indeks kerak bo‘lgandagina ishlating

Batafsil ma'lumotni komentariya topishingiz mumkin👇
👏71👍1🔥1
💡 #Python | for ... else — kam ishlatiladigan, lekin foydali konstruktsiya

Pythonda for sikliga else qo‘shish mumkin. Bu sikl break orqali to‘xtamasa — ya’ni normal tugasa — bajariladi.
for item in iterable:
if condition(item):
break
else:
handle_not_found()


🧩 Ishlash mexanizmi
• for → iteratorni aylantiradi (iter + next)
• Agar sikl StopIteration orqali tugasa → else bajariladi
• Agar break ishga tushsa → else o‘tilmaydi

⚙️ Amaliy misol
users = ["ali", "vali", "salim"]

for user in users:
if user == "nozim":
print("Topildi!")
break
else:
print("Foydalanuvchi topilmadi.")


🧠 else bloki qidiruv muvaffaqiyatsiz bo‘lganda ishlaydi — flag o‘zgaruvchi yozishning toza alternativasi.

🧠 Qachon ishlatish kerak?
• Qidiruv jarayonlarida (search, lookup)
• Loop tugash holatini aniq belgilashda
• flag yoki found kabi yordamchi o‘zgaruvchilarsiz kod yozishda

⚠️ Eslatma
for ... else kamdan-kam ishlatiladi, chunki ko‘p dasturchilar uni “sikl muvaffaqiyatsiz tugaganda else ishlaydi” deb noto‘g‘ri talqin qiladi.
Ammo to‘g‘ri joyda ishlatilsa — kodni yanada deklarativ va toza qiladi.

Qisqa xulosa:
for-else = “Agar break bo‘lmasa, elseni bajar.”

🔍 Elegant qidiruv mantiqi uchun Pythonic yechim.
32❤‍🔥1🔥1👏1😁1👌1
🎙 Pythonda ovozli dasturlar yaratish — pyttsx3 bilan!

Agar siz foydalanuvchiga matnni ovozga o‘qib beruvchi dastur yaratmoqchi bo‘lsangiz, pyttsx3 kutubxonasi aynan siz uchun 🔥

🧠 pyttsx3 nima?
pyttsx3 — bu Pythonda ishlovchi offline text-to-speech (TTS) kutubxona. Ya’ni, u internetga ulanmasdan turib ham matnni ovozga aylantira oladi!

⚙️ O‘rnatish:
pip install pyttsx3


🧩 Oddiy foydalanish namunasi:
import pyttsx3

engine = pyttsx3.init()
engine.say("Salom! Bugun siz bilan Python o‘rganamiz.")
engine.runAndWait()


💡 Qo‘shimcha imkoniyatlar:
• Ovoz tezligini o‘zgartirish
• Erkak yoki ayol ovozini tanlash
• Ovoz balandligini sozlash

Masalan:
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id) # 0 - erkak, 1 - ayol
engine.setProperty('rate', 150) # tezlik
engine.setProperty('volume', 0.9) # balandlik


🗣 Natijada sizning dasturingiz matnni jonli ovoz bilan o‘qib beradi!
Bu imkoniyatdan:
• Ovozli yordamchi yaratishda
• O‘quv dasturlarda
• Nogironlar uchun qulay interfeys yaratishda foydalanish mumkin.
🔥32👍1