🪄 Python Magic #2
📜 Kod parcha:
❓Savol: Natija nima chiqadi?
🎯 Javobni izohlarda yozing 👇
🧐 Nima uchun shunday chiqadi deb o‘ylaysiz?
📜 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
➡️ 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
➡️ 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
➡️ Barcha ichki obyektlar ham yangi yaratiladi.
a o‘zgarsa, b o‘zgarmaydi ✅
🔹 4. += vs = a + [...]
➡️ += 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.
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.
👍2❤1🔥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:
2. 🔸 Falsy — “yolg‘on” qiymatlar
if yoki while shartlarida False deb baholanadi.
Masalan:
🧾 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:
Natija:
🧩 Xulosa:
• Falsy — bool(value) → False
• Truthy — bool(value) → True
Shuning uchun shartlarda (if, while) bevosita obyektning o‘zini tekshirish kifoya:
🧠 Kichik sir:
Ko‘p hollarda if something: yoki if not something: deb yozish —
if len(something) > 0: yozishdan ancha “pythonic” hisoblanadi 🐍
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:
📌 Natijada sizga emodzilar ro‘yxati va ularning pozitsiyasi bilan lug‘at qaytariladi.
o'rnatish:
🔍 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:
🔍 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.
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
• O — Open/Closed Principle
• L — Liskov Substitution Principle
• I — Interface Segregation Principle
• D — Dependency 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.
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
• O — Open/Closed Principle
• L — Liskov Substitution Principle
• I — Interface Segregation Principle
• D — Dependency 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:
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:
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.
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
🎯 #SOLID — 2️⃣ 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):
➡️ Yangi shakl qo‘shmoqchimisiz?
Demak ifga yana shart qo‘shasiz. Bu — mavjud kodni o‘zgartirish degani 😬
✅ To‘g‘ri yechim (OCPga mos):
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."
🔹 “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:
🟢 Natija:
➡️ 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:
💡 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
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
🔥4❤3👍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
Bu yerda avval x ga qiymat beramiz, keyin undan alohida foydalanamiz.
🔹 Walrus operatori bilan
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)
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
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
🔥3❤1👏1😁1
📘 #Python | (A, B)[shart] — noodatiy ifoda
Ba’zan kodingizda shartga qarab 2 xil qiymatdan birini tanlash kerak bo‘ladi.
Masalan:
Natija: katta
🔹 Lekin buni “hiyla” orqali ham yozish mumkin 😎
💡 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:
➡️ 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:
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 💪
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🔥2⚡1👍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😄
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:
📤 Natija:
💡 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👇
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())
🔹 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👇
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👇
👏7❤1👍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.
🧩 Ishlash mexanizmi
• for → iteratorni aylantiradi (iter + next)
• Agar sikl StopIteration orqali tugasa → else bajariladi
• Agar break ishga tushsa → else o‘tilmaydi
⚙️ Amaliy misol
🧠 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.
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.
❤3⚡2❤🔥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:
🧩 Oddiy foydalanish namunasi:
💡 Qo‘shimcha imkoniyatlar:
• Ovoz tezligini o‘zgartirish
• Erkak yoki ayol ovozini tanlash
• Ovoz balandligini sozlash
Masalan:
🗣 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.
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.
🔥3❤2👍1
pyttsx3 si ieltsga tayyorlanayotgan yoki ingliz tili o'rganayotganlarga juda foydali ekan.
To'g'ri u o'zbekchani uncha o'qiy olmaydi, lekin ingliz tilini yaxshi o'qiydi va .mp3 faylga yozib beradi. Siz esa bu mp3 faylni telefonda eshitib yurishingiz mumkin.
To'g'ri u o'zbekchani uncha o'qiy olmaydi, lekin ingliz tilini yaxshi o'qiydi va .mp3 faylga yozib beradi. Siz esa bu mp3 faylni telefonda eshitib yurishingiz mumkin.
import pyttsx3
# Init TTS engine
engine = pyttsx3.init()
engine.setProperty('rate', 150) # speaking speed
engine.setProperty('volume', 1) # volume 0-1
phrases = [
"Turn left. Turn left at the corner.",
"Turn right. Turn right after the traffic lights.",
"Go straight. Go straight along this road.",
"Follow the road. Follow the road until you reach the park.",
"Cross the street. Cross the street at the zebra crossing.",
"Next to. The library is next to the post office.",
"Opposite. The bank is opposite the park.",
"Between. The school is between the supermarket and the cafe.",
"Near. There is a bus stop near the station.",
"Adjacent to. The new building is adjacent to the river.",
"Has been built. A new shopping mall has been built.",
"Has been removed. The old bridge has been removed.",
"Has been extended. The park has been extended.",
"Has been converted. The factory has been converted into apartments.",
"Has been relocated. The bus stop has been relocated."
]
# Combine phrases into one string
text = " ".join(phrases)
# Save to MP3
engine.save_to_file(text, 'IELTS_map_phrases.mp3')
engine.runAndWait()
🔥2❤1⚡1❤🔥1👍1
🚀 #Python: List Comprehension — qisqa, tez va samarali kod yozish usuli
Ko‘p hollarda ro‘yxat (list) yaratish uchun for siklidan foydalanamiz.
Lekin Pythonda buni bitta qatorda yozish mumkin 😎
🧩 Bu kodda nima bo‘layapti?
1️⃣ for i in range(5) → i qiymatlari: 0, 1, 2, 3, 4
2️⃣ if i > 0 → faqat 1, 2, 3, 4 olinadi
3️⃣ i * 2 → har bir son 2 ga ko‘paytiriladi
✅ Natija: [2, 4, 6, 8]
⚡️ Nega List Comprehension foydali?
✅ 1. Kod qisqaradi
👉 Natija bir xil, lekin kod ancha ixcham va o‘qilishi oson.
✅ 2. Ishlash tezligi yuqori
append() chaqiruvlari yo‘q, hammasi Pythonning ichki C darajasidagi optimallashtirilgan loopda bajariladi.
Masalan:
💡 Natija odatda 1.5–2 baravar tezroq bo‘ladi!
✅ 3. O‘qish oson va tushunarli
✅ 4. Filtrlash va o‘zgartirishni oson qiladi
✅ 5. Bir necha sikllarni birlashtirish
Hatto bir nechta for ni bitta list comprehension ichida ishlatish ham mumkin:
💬 Xulosa:
🔹 List comprehension — Pythonning eng qulay sintaksislaridan biri.
🔹 Kodni ixcham qiladi.
🔹 Ishlashni tezlashtiradi.
🔹 O‘qishni osonlashtiradi.
Ko‘p hollarda ro‘yxat (list) yaratish uchun for siklidan foydalanamiz.
Lekin Pythonda buni bitta qatorda yozish mumkin 😎
numbers = [i * 2 for i in range(5) if i > 0]
print(numbers)
🧩 Bu kodda nima bo‘layapti?
1️⃣ for i in range(5) → i qiymatlari: 0, 1, 2, 3, 4
2️⃣ if i > 0 → faqat 1, 2, 3, 4 olinadi
3️⃣ i * 2 → har bir son 2 ga ko‘paytiriladi
✅ Natija: [2, 4, 6, 8]
⚡️ Nega List Comprehension foydali?
✅ 1. Kod qisqaradi
# Oddiy usul
nums = []
for i in range(5):
if i > 0:
nums.append(i * 2)
# List comprehension
nums = [i * 2 for i in range(5) if i > 0]
👉 Natija bir xil, lekin kod ancha ixcham va o‘qilishi oson.
✅ 2. Ishlash tezligi yuqori
append() chaqiruvlari yo‘q, hammasi Pythonning ichki C darajasidagi optimallashtirilgan loopda bajariladi.
Masalan:
import time
# Oddiy for
start = time.time()
nums = []
for i in range(10_000_000):
nums.append(i * 2)
print("Oddiy for:", time.time() - start)
# List comprehension
start = time.time()
nums = [i * 2 for i in range(10_000_000)]
print("List comprehension:", time.time() - start)
💡 Natija odatda 1.5–2 baravar tezroq bo‘ladi!
✅ 3. O‘qish oson va tushunarli
even = [x for x in range(10) if x % 2 == 0]
# Juft sonlar ro‘yxati
✅ 4. Filtrlash va o‘zgartirishni oson qiladi
words = ["hello", "python", "world"]
lengths = [len(w) for w in words] # [5, 6, 5]
✅ 5. Bir necha sikllarni birlashtirish
Hatto bir nechta for ni bitta list comprehension ichida ishlatish ham mumkin:
pairs = [(x, y) for x in [1, 2] for y in ['a', 'b']]
# [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
💬 Xulosa:
🔹 List comprehension — Pythonning eng qulay sintaksislaridan biri.
🔹 Kodni ixcham qiladi.
🔹 Ishlashni tezlashtiradi.
🔹 O‘qishni osonlashtiradi.
👍6❤2🔥2