🐍 Python: @classmethod nimaga kerak?
Pythonda obyektlar va classlar qanday ishlashini tushunish — toza va mantiqli kod yozishning asosiy qismidir. Bugun @classmethod haqida sodda qilib tushuntiramiz.
🔹 Obyekt atributi vs Class atributi
• Obyekt atributi — har bir yaratilgan obyektga tegishli (self).
• Class atributi — butun classga tegishli, barcha obyektlar ishlatadi (cls).
Demak class ham obyekt ham o'zining attributiga ega ekan, nega endi ularni o'zining metodlariga ega bo'lolmas ekan, albatta uning ham imkoni bor. Agar biz odatdagi metod yaratsak u metod obyektga tegishli bo'ladi va obyekt yaratilgandan keyin ishlaydi, @classmethod orqali metod yaratsak esa, bu metod class ga tegishli bo'ladi va uni obyekt yaratilmasdan oldin ham ishlata olamiz.
Yana yuqoridagi postda aytdikki, class atributini obyekt metodi yoki attributi orqali o'zgartirishni imkoni yo'q, agar o'zgartiramiz desak obyekt o'zgartirish o'zrniga o'zida shunaqa attribut yaratib oladi. Lekin biz class attributini @classmethod orqali hosil qilingan metod orqali o'zgartirishimiz mumkin, chunki bu metod class ga tegishli.
🔹 @classmethod nima qiladi?
@classmethod — classga tegishli metod.
U obyektga emas, classning o‘ziga ishlaydi, shuning uchun u birinchi argument sifatida: cls qabul qiladi.
Obyekt orqali chaqirilsa ham, baribir class bilan ishlaydi, obyekt bilan emas.
🔍 Misol:
• count → class atributi
• get_count() → class metodi
• obyektlar → class atributidan foydalana oladi
• obyektlar → class metodidan ham foydalana oladi
(lekin metod baribir cls bilan ishlaydi)
📌 Qisqa xulosa
• Obyekt → class atributidan foydalana oladi.
• Xuddi shunday obyekt → class metodidan (@classmethod) ham foydalana oladi.
• Lekin @classmethod obyektga emas, classga tegishli.
Pythonda obyektlar va classlar qanday ishlashini tushunish — toza va mantiqli kod yozishning asosiy qismidir. Bugun @classmethod haqida sodda qilib tushuntiramiz.
🔹 Obyekt atributi vs Class atributi
• Obyekt atributi — har bir yaratilgan obyektga tegishli (self).
• Class atributi — butun classga tegishli, barcha obyektlar ishlatadi (cls).
Demak class ham obyekt ham o'zining attributiga ega ekan, nega endi ularni o'zining metodlariga ega bo'lolmas ekan, albatta uning ham imkoni bor. Agar biz odatdagi metod yaratsak u metod obyektga tegishli bo'ladi va obyekt yaratilgandan keyin ishlaydi, @classmethod orqali metod yaratsak esa, bu metod class ga tegishli bo'ladi va uni obyekt yaratilmasdan oldin ham ishlata olamiz.
Yana yuqoridagi postda aytdikki, class atributini obyekt metodi yoki attributi orqali o'zgartirishni imkoni yo'q, agar o'zgartiramiz desak obyekt o'zgartirish o'zrniga o'zida shunaqa attribut yaratib oladi. Lekin biz class attributini @classmethod orqali hosil qilingan metod orqali o'zgartirishimiz mumkin, chunki bu metod class ga tegishli.
🔹 @classmethod nima qiladi?
@classmethod — classga tegishli metod.
U obyektga emas, classning o‘ziga ishlaydi, shuning uchun u birinchi argument sifatida: cls qabul qiladi.
Obyekt orqali chaqirilsa ham, baribir class bilan ishlaydi, obyekt bilan emas.
🔍 Misol:
class Counter:
count = 0 # sinf atributi
def __init__(self):
Counter.count += 1
@classmethod
def get_count(cls):
return cls.count
• count → class atributi
• get_count() → class metodi
• obyektlar → class atributidan foydalana oladi
• obyektlar → class metodidan ham foydalana oladi
(lekin metod baribir cls bilan ishlaydi)
📌 Qisqa xulosa
• Obyekt → class atributidan foydalana oladi.
• Xuddi shunday obyekt → class metodidan (@classmethod) ham foydalana oladi.
• Lekin @classmethod obyektga emas, classga tegishli.
👍2🔥1👀1
Forwarded from Isoqjanov Ilyos | Python
🐍🎭 Python’da dekorator yozyapsizmi? @wraps-siz bo‘lmang!
Ko‘pchilik dekorator yozganda bir xatoga yo‘l qo‘yadi:
Ular funksiya metadatasini yo‘qotib qo‘yadi — nomi, hujjati, parametrlari yo‘qoladi!
🎯 Yechim: functools.wraps
✅ Asl funksiyaning:
• Nomi (name)
• Hujjati (doc)
• Annotatsiyalari
• Modul nomi
hammasini saqlab qoladi.
💡 wraps bo‘lmasa — hello funksiyangiz nomi ichki bo‘lib qoladi va help() yoki logging ishlamaydi.
⚠️ Dekorator yozsangiz, @wraps har doim yozing. Bu yaxshi amaliyot (best practice)!
Ko‘pchilik dekorator yozganda bir xatoga yo‘l qo‘yadi:
Ular funksiya metadatasini yo‘qotib qo‘yadi — nomi, hujjati, parametrlari yo‘qoladi!
🎯 Yechim: functools.wraps
✅ Asl funksiyaning:
• Nomi (name)
• Hujjati (doc)
• Annotatsiyalari
• Modul nomi
hammasini saqlab qoladi.
💡 wraps bo‘lmasa — hello funksiyangiz nomi ichki bo‘lib qoladi va help() yoki logging ishlamaydi.
⚠️ Dekorator yozsangiz, @wraps har doim yozing. Bu yaxshi amaliyot (best practice)!
Dasturchi SQL queryni bilishi kerakmi?
Bugungi kunda ko‘pchilik ORMdan foydalanadi. Lekin bu SQL bilish shart emas, degani emas.
1️⃣ Ha, SQL ni bilishi — shart.
Negaki, ORM faqat qulay vosita. Lekin backend logikasi oxir-oqibat baribir SQL queryga aylanadi. Shu sababli:
• Query nima bo‘layotganini tushunish
• Performance muammolarini topish
• Noto‘g‘ri join, filtr yoki index sababli sekinlashishni aniqlash
• ORM qila olmaydigan murakkab report yoki agregatlarni yozish
bularning barchasi SQLni bilishni talab qiladi.
2️⃣ ORM — qulaylik, SQL — poydevor.
CRUD — ORM bilan.
Murakkab va optimizatsiya talab qiladigan querylar — SQL bilan.
Professional darajada ishlaydigan backendchi ikkalasini ham biladi.
3️⃣ Yakuniy xulosa
Ha, dasturchi SQLni bilishi kerak.
ORM uni soddalashtiradi xolos, almashtirmaydi.
Siz ham o'z fikringizni bildiring👇
Bugungi kunda ko‘pchilik ORMdan foydalanadi. Lekin bu SQL bilish shart emas, degani emas.
1️⃣ Ha, SQL ni bilishi — shart.
Negaki, ORM faqat qulay vosita. Lekin backend logikasi oxir-oqibat baribir SQL queryga aylanadi. Shu sababli:
• Query nima bo‘layotganini tushunish
• Performance muammolarini topish
• Noto‘g‘ri join, filtr yoki index sababli sekinlashishni aniqlash
• ORM qila olmaydigan murakkab report yoki agregatlarni yozish
bularning barchasi SQLni bilishni talab qiladi.
2️⃣ ORM — qulaylik, SQL — poydevor.
CRUD — ORM bilan.
Murakkab va optimizatsiya talab qiladigan querylar — SQL bilan.
Professional darajada ishlaydigan backendchi ikkalasini ham biladi.
3️⃣ Yakuniy xulosa
Ha, dasturchi SQLni bilishi kerak.
ORM uni soddalashtiradi xolos, almashtirmaydi.
Siz ham o'z fikringizni bildiring👇
👍4❤1🔥1
✅ Qachon biz SQL ishlatishga majburmiz?
1️⃣ Murakkab querylar ORMdan chiqib ketganda
Ba’zan ORM bilan yozish imkonsiz yoki juda noqulay bo‘lgan holatlar bo‘ladi:
• Window functionlar (ROW_NUMBER, RANK, LAG, LEAD)
• Murakkab subquerylar
• Analytics / reporting querylar
• Recursive querylar (CTE — WITH RECURSIVE)
ORM bunday joylarda ortiqcha kod yozishga majbur qiladi yoki umuman qo‘llab-quvvatlamaydi.
2️⃣ Performance muammosini optimizatsiya qilishda
Ba’zi querylarni ORM o‘zi avtomatik optimal yozmaydi:
• Keraksiz JOINlar
• Redundant querylar
• N+1 problemalari
• Inefficient filtr va sortlar
Performance kerak bo‘lsa, qo'lda SQL yozish shart.
3️⃣ Bulk operatsiyalarni tez bajarish kerak bo‘lganda
ORM ko‘pincha row-by-row ishlaydi. Shuning uchun:
• millionlab yozuvlarni UPDATE qilish
• katta mass INSERTlar
• batch DELETE
kabi operatsiyalarni raw SQL orqali ancha tez bajarish mumkin.
4️⃣ Databasega xos funksiyalardan foydalanishda
Har bir DB o‘ziga xos kuchli imkoniyatlarga ega:
• PostgreSQL → JSONB, array, full-text search
• MySQL → GIS, special indexing
• MSSQL → pivot/unpivot, advanced window functions
ORM bularning barchasini to‘liq qamrab ololmaydi.
5️⃣ Database-level tashkiliy kodlar kerak bo‘lganda
Masalan:
• Stored procedures
• Triggers
• Functions
• Materialized views
Bu holatlar SQLni chetlab o‘tib bo‘lmaydi.
6️⃣ DBA / DevOps bilan ishlayotganda
Monitoring, debugging, slow query analysis kabi ishlarda SQL bilish zarur:
• EXPLAIN / EXPLAIN ANALYZE
• Query planlarni tahlil qilish
• Index strategiyasini to‘g‘ri qo‘yish
Bular ORM bilan qilinmaydi.
🎯 Xulosa
ORM — qulaylik. SQL — poydevor.
Shu sababli professional backendchi:
• CRUD → ORM
• Murakkab / performance / DB-specific → SQL
kombinatsiyasidan foydalanadi.
1️⃣ Murakkab querylar ORMdan chiqib ketganda
Ba’zan ORM bilan yozish imkonsiz yoki juda noqulay bo‘lgan holatlar bo‘ladi:
• Window functionlar (ROW_NUMBER, RANK, LAG, LEAD)
• Murakkab subquerylar
• Analytics / reporting querylar
• Recursive querylar (CTE — WITH RECURSIVE)
ORM bunday joylarda ortiqcha kod yozishga majbur qiladi yoki umuman qo‘llab-quvvatlamaydi.
2️⃣ Performance muammosini optimizatsiya qilishda
Ba’zi querylarni ORM o‘zi avtomatik optimal yozmaydi:
• Keraksiz JOINlar
• Redundant querylar
• N+1 problemalari
• Inefficient filtr va sortlar
Performance kerak bo‘lsa, qo'lda SQL yozish shart.
3️⃣ Bulk operatsiyalarni tez bajarish kerak bo‘lganda
ORM ko‘pincha row-by-row ishlaydi. Shuning uchun:
• millionlab yozuvlarni UPDATE qilish
• katta mass INSERTlar
• batch DELETE
kabi operatsiyalarni raw SQL orqali ancha tez bajarish mumkin.
4️⃣ Databasega xos funksiyalardan foydalanishda
Har bir DB o‘ziga xos kuchli imkoniyatlarga ega:
• PostgreSQL → JSONB, array, full-text search
• MySQL → GIS, special indexing
• MSSQL → pivot/unpivot, advanced window functions
ORM bularning barchasini to‘liq qamrab ololmaydi.
5️⃣ Database-level tashkiliy kodlar kerak bo‘lganda
Masalan:
• Stored procedures
• Triggers
• Functions
• Materialized views
Bu holatlar SQLni chetlab o‘tib bo‘lmaydi.
6️⃣ DBA / DevOps bilan ishlayotganda
Monitoring, debugging, slow query analysis kabi ishlarda SQL bilish zarur:
• EXPLAIN / EXPLAIN ANALYZE
• Query planlarni tahlil qilish
• Index strategiyasini to‘g‘ri qo‘yish
Bular ORM bilan qilinmaydi.
🎯 Xulosa
ORM — qulaylik. SQL — poydevor.
Shu sababli professional backendchi:
• CRUD → ORM
• Murakkab / performance / DB-specific → SQL
kombinatsiyasidan foydalanadi.
🔥5👍4❤3
🔍 Profiling nima?
Profiling — bu dastur bajarilishi vaqtida:
• qaysi funksiya
• necha marta chaqirilgani
• qancha vaqt ishlagani
haqida aniq statistika beradigan tahlil usuli.
Pythonda buning uchun eng asosiy modul — cProfile.
🧠 cProfile nima?
cProfile — Pythonning standart (built-in) profiling moduli bo‘lib, u:
• butun dastur bajarilishini tahlil qiladi
• sekin ishlayotgan funksiyalarni topadi
• optimallashtirishga yo‘l ko‘rsatadi
📌 U faqat funksiyalarni emas, balki butun kod oqimini kuzatadi.
▶️ Oddiy foydalanish
📊 Natijada nimani ko‘ramiz?
Profiling natijasida quyidagi ustunlar chiqadi:
• ncalls — funksiya nechta marta chaqirilgan
• tottime — funksiya ichida sarflangan vaqt
• cumtime — funksiya + ichki chaqiriqlar bilan umumiy vaqt
📌 cumtime katta bo‘lsa — funksiya sekin ishlayapti!
❗️ Muhim eslatmalar
• Avval profiling, keyin optimallashtirish
• Taxmin bilan emas, statistikaga qarab ishlang
• Har doim ham eng uzun kod sekin bo‘lmaydi
✅ Xulosa
🔹 cProfile — Python dasturchisi uchun majburiy vosita
🔹 Sekin joylarni aniq topib beradi
🔹 Katta loyihalarda vaqt va resursni tejaydi
👉 “Sekin kodni tezlashtirish profilingdan boshlanadi!”
Profiling — bu dastur bajarilishi vaqtida:
• qaysi funksiya
• necha marta chaqirilgani
• qancha vaqt ishlagani
haqida aniq statistika beradigan tahlil usuli.
Pythonda buning uchun eng asosiy modul — cProfile.
🧠 cProfile nima?
cProfile — Pythonning standart (built-in) profiling moduli bo‘lib, u:
• butun dastur bajarilishini tahlil qiladi
• sekin ishlayotgan funksiyalarni topadi
• optimallashtirishga yo‘l ko‘rsatadi
📌 U faqat funksiyalarni emas, balki butun kod oqimini kuzatadi.
▶️ Oddiy foydalanish
import cProfile
def slow_function():
total = 0
for i in range(1_000_000):
total += i
return total
cProfile.run("slow_function()")
📊 Natijada nimani ko‘ramiz?
Profiling natijasida quyidagi ustunlar chiqadi:
• ncalls — funksiya nechta marta chaqirilgan
• tottime — funksiya ichida sarflangan vaqt
• cumtime — funksiya + ichki chaqiriqlar bilan umumiy vaqt
📌 cumtime katta bo‘lsa — funksiya sekin ishlayapti!
❗️ Muhim eslatmalar
• Avval profiling, keyin optimallashtirish
• Taxmin bilan emas, statistikaga qarab ishlang
• Har doim ham eng uzun kod sekin bo‘lmaydi
✅ Xulosa
🔹 cProfile — Python dasturchisi uchun majburiy vosita
🔹 Sekin joylarni aniq topib beradi
🔹 Katta loyihalarda vaqt va resursni tejaydi
👉 “Sekin kodni tezlashtirish profilingdan boshlanadi!”
👍5❤3🔥2
💡 Python if shartlari va tekshirish ketma-ketligi
Pythonda if dagi shartlar operatorlarga qarab tekshiriladi va short-circuit (qisqa tutashuv) baholash qo‘llanadi.
1️⃣ and operatori
• Python chapdan o‘nga tekshiradi.
• Agar birinchi shart False bo‘lsa, ikkinchi shartni tekshirmaydi.
• Foydasi: keraksiz tekshiruvdan qochadi va xatolardan saqlaydi.
Misol:
• and bilan birinchi shart (os.path.exists("data.txt")) chapdan tekshiriladi.
• Agar fayl mavjud bo‘lmasa, ikkinchi shart (os.access) tekshirilmaydi, xatolik bo‘lmaydi.
2️⃣ or operatori
• Python ham chapdan o‘nga tekshiradi.
• Agar birinchi shart True bo‘lsa, ikkinchi shartni tekshirmaydi.
• Foydasi: kerakli shart allaqachon True bo‘lsa, qolganlarini tekshirmasdan o‘tadi.
Misol:
Agar x == 0 True bo‘lsa, 10 / x hech qachon tekshirilmaydi → ZeroDivisionError bo‘lmaydi.
✅ Xulosa
• Short-circuiting: Python faqat kerakli shartlarni tekshiradi.
• and: birinchi shart False bo‘lsa, qolganlari tekshirilmaydi.
• or: birinchi shart True bo‘lsa, qolganlari tekshirilmaydi.
• Shuning uchun shartlarni xatolik va samaradorlik nuqtai nazaridan tartiblang.
Pythonda if dagi shartlar operatorlarga qarab tekshiriladi va short-circuit (qisqa tutashuv) baholash qo‘llanadi.
1️⃣ and operatori
if shart1 and shart2:
...
• Python chapdan o‘nga tekshiradi.
• Agar birinchi shart False bo‘lsa, ikkinchi shartni tekshirmaydi.
• Foydasi: keraksiz tekshiruvdan qochadi va xatolardan saqlaydi.
Misol:
if os.path.exists("data.txt") and os.access("data.txt", os.R_OK):
print("Fayl mavjud va o'qishga ruxsat berilgan")• and bilan birinchi shart (os.path.exists("data.txt")) chapdan tekshiriladi.
• Agar fayl mavjud bo‘lmasa, ikkinchi shart (os.access) tekshirilmaydi, xatolik bo‘lmaydi.
2️⃣ or operatori
if shart1 or shart2:
...
• Python ham chapdan o‘nga tekshiradi.
• Agar birinchi shart True bo‘lsa, ikkinchi shartni tekshirmaydi.
• Foydasi: kerakli shart allaqachon True bo‘lsa, qolganlarini tekshirmasdan o‘tadi.
Misol:
if x == 0 or 10 / x > 1:
print("Shart bajarildi")
Agar x == 0 True bo‘lsa, 10 / x hech qachon tekshirilmaydi → ZeroDivisionError bo‘lmaydi.
✅ Xulosa
• Short-circuiting: Python faqat kerakli shartlarni tekshiradi.
• and: birinchi shart False bo‘lsa, qolganlari tekshirilmaydi.
• or: birinchi shart True bo‘lsa, qolganlari tekshirilmaydi.
• Shuning uchun shartlarni xatolik va samaradorlik nuqtai nazaridan tartiblang.
🔥5👍4❤3
📌 Pythonda with context manager bilan bir nechta fayl ochish mumkinmi?
👉 Ha, mumkin va juda qulay!
Pythonda with operatori fayllarni avtomatik yopish imkonini beradi. Eng yaxshi tomoni — bir vaqtning o‘zida bir nechta faylni ochish mumkin 🔥
✅ 1️⃣ Bitta with ichida bir nechta fayl
📌 with bloki tugashi bilan barcha fayllar yopiladi, zo'r a?
✅ 2️⃣ Agar fayllar soni noma’lum bo‘lsa (ExitStack)
📌 Bu usul dinamik va professional yechim hisoblanadi.
🚀 Xulosa
• Kam fayl → with open() as f1, open() as f2
• Ko‘p yoki noma’lum fayl → ExitStack
• close() ni qo‘lda yozish shart emas
💡 Toza kod — yaxshi dasturchining belgisi.
👉 Ha, mumkin va juda qulay!
Pythonda with operatori fayllarni avtomatik yopish imkonini beradi. Eng yaxshi tomoni — bir vaqtning o‘zida bir nechta faylni ochish mumkin 🔥
✅ 1️⃣ Bitta with ichida bir nechta fayl
with open("file1.txt") as f1, open("file2.txt") as f2:
print(f1.read())
print(f2.read())📌 with bloki tugashi bilan barcha fayllar yopiladi, zo'r a?
✅ 2️⃣ Agar fayllar soni noma’lum bo‘lsa (ExitStack)
from contextlib import ExitStack
files = ["a.txt", "b.txt", "c.txt"]
with ExitStack() as stack:
opened_files = [stack.enter_context(open(f)) for f in files]
for f in opened_files:
print(f.read())
📌 Bu usul dinamik va professional yechim hisoblanadi.
🚀 Xulosa
• Kam fayl → with open() as f1, open() as f2
• Ko‘p yoki noma’lum fayl → ExitStack
• close() ni qo‘lda yozish shart emas
💡 Toza kod — yaxshi dasturchining belgisi.
👍4❤🔥3🔥2⚡1
📌 Base64 nima va u nima uchun kerak?
Base64 — bu binary (ikkilik) ma’lumotlarni matn (text) ko‘rinishida ifodalash usuli.
Ya’ni rasm, video, fayl kabi ma’lumotlarni xavfsiz uzatish uchun ishlatiladi.
❓ Nega Base64 kerak?
Ba’zi tizimlar faqat text bilan ishlaydi (masalan: JSON, XML, email).
Shu sababli binary ma’lumotlarni to‘g‘ridan-to‘g‘ri uzatib bo‘lmaydi.
👉 Base64 bu muammoni hal qiladi.
🔤 Base64 qanday ishlaydi?
• Ma’lumot 6 bitli bo‘laklarga bo‘linadi
• Har bir bo‘lak maxsus belgilar to‘plamiga moslanadi:
• Natija — faqat o‘qiladigan text
📌 Oxirida = belgisi padding (to‘ldirish) uchun ishlatiladi.
🧑💻 Python misolida
⚠️ Muhim eslatma
❌ Base64 — shifrlash (encryption) emas
✔️ Bu faqat kodlash (encoding)
📌 Base64 ma’lumot hajmini taxminan 33% ga oshiradi
📦 Qayerlarda ishlatiladi?
• API (JSON ichida rasm yuborish)
• JWT tokenlar
• Email attachment’lar
• HTML / CSS (data:image/png;base64,...)
🚀 Xulosa
• Base64 — binary → text
• Xavfsiz uzatish uchun qulay
• Lekin maxfiylik bermaydi
💡 Base64ni tushunish — backend va APIlar bilan ishlashda juda muhim.
Base64 — bu binary (ikkilik) ma’lumotlarni matn (text) ko‘rinishida ifodalash usuli.
Ya’ni rasm, video, fayl kabi ma’lumotlarni xavfsiz uzatish uchun ishlatiladi.
❓ Nega Base64 kerak?
Ba’zi tizimlar faqat text bilan ishlaydi (masalan: JSON, XML, email).
Shu sababli binary ma’lumotlarni to‘g‘ridan-to‘g‘ri uzatib bo‘lmaydi.
👉 Base64 bu muammoni hal qiladi.
🔤 Base64 qanday ishlaydi?
• Ma’lumot 6 bitli bo‘laklarga bo‘linadi
• Har bir bo‘lak maxsus belgilar to‘plamiga moslanadi:
A–Z a–z 0–9 + /
• Natija — faqat o‘qiladigan text
📌 Oxirida = belgisi padding (to‘ldirish) uchun ishlatiladi.
🧑💻 Python misolida
import base64
text = "Hello World"
encoded = base64.b64encode(text.encode())
decoded = base64.b64decode(encoded).decode()
print(encoded) # b'SGVsbG8gV29ybGQ='
print(decoded) # Hello World
⚠️ Muhim eslatma
❌ Base64 — shifrlash (encryption) emas
✔️ Bu faqat kodlash (encoding)
📌 Base64 ma’lumot hajmini taxminan 33% ga oshiradi
📦 Qayerlarda ishlatiladi?
• API (JSON ichida rasm yuborish)
• JWT tokenlar
• Email attachment’lar
• HTML / CSS (data:image/png;base64,...)
🚀 Xulosa
• Base64 — binary → text
• Xavfsiz uzatish uchun qulay
• Lekin maxfiylik bermaydi
💡 Base64ni tushunish — backend va APIlar bilan ishlashda juda muhim.
👍4❤2🔥2
🐍 RxPy — Pythonda Reactive Programming
Agar siz:
— asinxron jarayonlar
— event va real-time data
— murakkab oqimlarni soddalashtirish
bilan ishlayotgan bo‘lsangiz, RxPy siz uchun juda foydali kutubxona.
🔹 RxPy nima?
RxPy (ReactiveX for Python) — bu Observable (ma’lumot oqimi) va Observer (kuzatuvchi) konsepsiyasiga asoslangan reaktiv dasturlash kutubxonasi.
Oddiy qilib aytganda:
“Ma’lumot keladi → oqimdan o‘tadi → qayta ishlanadi”
🔹 Oddiy misol
Qisqacha qilib 👇
• from_([1,2,3,4])
→ listni ma’lumot oqimi (Observable) ga aylantiradi
• map(lambda x: x * 2)
→ har bir qiymatni 2 ga ko‘paytiradi
• filter(lambda x: x > 4)
→ 4 dan katta qiymatlarnigina qoldiradi
• pipe(...)
→ oqimni ketma-ket operatorlardan o‘tkazadi
• subscribe(print)
→ oqimni ishga tushiradi va natijani chiqaradi
📌 Natija:
🔹 RxPy nimada kuchli?
✅ Asinxron ishlar
✅ Event-driven arxitektura
✅ Stream bilan ishlash
✅ Kod kam, mantiq aniq
✅ map / filter / merge / debounce kabi operatorlar
🔹 Qayerda ishlatiladi?
— API va websocketlar
— real-time data
— GUI ilovalar (PyQt, Tkinter)
— microservice oqimlari
🔹 O‘rnatish
🔹 Qachon ishlatmaslik kerak?
❌ oddiy sinxron skriptlar
❌ kichik loyihalar
❌ reactive fikrlash kerak bo‘lmagan joylar
💡 Xulosa:
RxPy — murakkab ma’lumot oqimlarini toza, boshqariladigan va kengaytiriladigan qilib yozish uchun kuchli vosita.
Agar siz:
— asinxron jarayonlar
— event va real-time data
— murakkab oqimlarni soddalashtirish
bilan ishlayotgan bo‘lsangiz, RxPy siz uchun juda foydali kutubxona.
🔹 RxPy nima?
RxPy (ReactiveX for Python) — bu Observable (ma’lumot oqimi) va Observer (kuzatuvchi) konsepsiyasiga asoslangan reaktiv dasturlash kutubxonasi.
Oddiy qilib aytganda:
“Ma’lumot keladi → oqimdan o‘tadi → qayta ishlanadi”
🔹 Oddiy misol
from rx import from_
from rx import operators as ops
from_([1, 2, 3, 4]).pipe(
ops.map(lambda x: x * 2),
ops.filter(lambda x: x > 4)
).subscribe(print)
Qisqacha qilib 👇
• from_([1,2,3,4])
→ listni ma’lumot oqimi (Observable) ga aylantiradi
• map(lambda x: x * 2)
→ har bir qiymatni 2 ga ko‘paytiradi
• filter(lambda x: x > 4)
→ 4 dan katta qiymatlarnigina qoldiradi
• pipe(...)
→ oqimni ketma-ket operatorlardan o‘tkazadi
• subscribe(print)
→ oqimni ishga tushiradi va natijani chiqaradi
📌 Natija:
6
8
🔹 RxPy nimada kuchli?
✅ Asinxron ishlar
✅ Event-driven arxitektura
✅ Stream bilan ishlash
✅ Kod kam, mantiq aniq
✅ map / filter / merge / debounce kabi operatorlar
🔹 Qayerda ishlatiladi?
— API va websocketlar
— real-time data
— GUI ilovalar (PyQt, Tkinter)
— microservice oqimlari
🔹 O‘rnatish
pip install rx
🔹 Qachon ishlatmaslik kerak?
❌ oddiy sinxron skriptlar
❌ kichik loyihalar
❌ reactive fikrlash kerak bo‘lmagan joylar
💡 Xulosa:
RxPy — murakkab ma’lumot oqimlarini toza, boshqariladigan va kengaytiriladigan qilib yozish uchun kuchli vosita.
❤6👍4🔥4
🐍 Pythonda Name Mangling nima?
Pythonda double underscore (__) bilan boshlanadigan atribut va metodlar tashqaridan bevosita ko‘rinmas bo‘lishi uchun avtomatik ravishda o‘zgartiriladi.
Bu mexanizm name mangling deb ataladi.
Python ichida atribut nomi quyidagicha o‘zgartiriladi:
Shu sababli class tashqarisidan __attr ga to‘g‘ridan-to‘g‘ri murojaat qilib bo‘lmaydi.
📌 Misol
🧠 Izoh
• Python bu orqali atributni tasodifan tashqaridan o‘zgartirib yuborishdan himoya qiladi
• Bu haqiqiy private emas, lekin accidental overwrite ni oldini oladi
• Name mangling asosan inheritance vaqtida foydali
🔍 Single underscore vs Double underscore
• _var —> obj._var kabi murojat qilinadi, oddiy protected attribut sifatida ishlatiladi.
• __var —> obj._ClassName__var kabi murojat qilinadi, chunki name mangling mavjud, murakkabroq
Eslatma: Yana bir qiziq tomoni biz odatda obyektning attributi bilan ishlash uchun ishlatadigan hasattr(), getattr() va setattr() ni __var kabi attributlar bilan ishlata olmaymiz. Chunki ular pythonning ichki mexanizmida name mangling tufayli obj._ClassName__var kabi saqlangan bo'ladi.
📌 Qt signal-slot, getattr/setattr, threadlar bilan ishlaganda
_var ishlatish ancha qulay.
🧩 Name Mangling bo‘yicha xulosa
• Pythondagi encapsulation mexanizmi
• Inheritance paytida nomlar to‘qnashuvini oldini oladi
• __var ni faqat haqiqatan ichki bo‘lishi kerak bo‘lgan atributlar uchun ishlatish kerak
• Aksariyat holatlarda single underscore (_var) yetarli
Pythonda double underscore (__) bilan boshlanadigan atribut va metodlar tashqaridan bevosita ko‘rinmas bo‘lishi uchun avtomatik ravishda o‘zgartiriladi.
Bu mexanizm name mangling deb ataladi.
Python ichida atribut nomi quyidagicha o‘zgartiriladi:
__attr → _ClassName__attr
Shu sababli class tashqarisidan __attr ga to‘g‘ridan-to‘g‘ri murojaat qilib bo‘lmaydi.
📌 Misol
class MyClass:
def __init__(self):
self.__private_var = 42 # double underscore
obj = MyClass()
# print(obj.__private_var) # ❌ AttributeError
print(obj._MyClass__private_var) # ✅ 42
🧠 Izoh
• Python bu orqali atributni tasodifan tashqaridan o‘zgartirib yuborishdan himoya qiladi
• Bu haqiqiy private emas, lekin accidental overwrite ni oldini oladi
• Name mangling asosan inheritance vaqtida foydali
🔍 Single underscore vs Double underscore
• _var —> obj._var kabi murojat qilinadi, oddiy protected attribut sifatida ishlatiladi.
• __var —> obj._ClassName__var kabi murojat qilinadi, chunki name mangling mavjud, murakkabroq
Eslatma: Yana bir qiziq tomoni biz odatda obyektning attributi bilan ishlash uchun ishlatadigan hasattr(), getattr() va setattr() ni __var kabi attributlar bilan ishlata olmaymiz. Chunki ular pythonning ichki mexanizmida name mangling tufayli obj._ClassName__var kabi saqlangan bo'ladi.
📌 Qt signal-slot, getattr/setattr, threadlar bilan ishlaganda
_var ishlatish ancha qulay.
🧩 Name Mangling bo‘yicha xulosa
• Pythondagi encapsulation mexanizmi
• Inheritance paytida nomlar to‘qnashuvini oldini oladi
• __var ni faqat haqiqatan ichki bo‘lishi kerak bo‘lgan atributlar uchun ishlatish kerak
• Aksariyat holatlarda single underscore (_var) yetarli
❤3👍2🔥1👏1
🐍 Scope nima? (oddiy tushuntirish bilan)
Siz yozgan o‘zgaruvchi kodning hamma joyida ishlaydimi? 🤔 Yo‘q. Python har bir o‘zgaruvchiga qayerda yaratilganiga qarab ruxsat beradi. Bu tushuncha — scope deyiladi.
🧭 Python o'zgaruvchini qanday qidiradi?
Python o‘zgaruvchini 4 bosqichda qidiradi:
L → E → G → B
• Local — hozirgi funksiya ichida
• Enclosing — tashqi (nested) funksiya ichida
• Global — fayl darajasida
• Built-in — Python ichidagi tayyor nomlar (len, print, ...)
Topilmasa → ❌ NameError
📌 1. Local (eng yaqin scope)
👉 x faqat funksiya ichida yashaydi, funksiyadan tashqarida uni tog'ridan-to'g'ri ishlata olmaysiz!
📌 2. Global
👉 Funksiya global o'zgaruvchini muammosiz o‘qiy oladi. Lekin o‘zgartirmoqchi bo‘lsangiz global kalit so'zini ishlatish majburiy:
👉 global — tashqaridagi o‘zgaruvchini o‘zgartiradi
📌 3. Enclosing (nested funksiyalar)
⚠️ nonlocal ishlatish
👉 nonlocal — ichki funksiya ichida tashqi funksiyaning o‘zgaruvchisini o‘zgartiradi
🧩 Xulosa
✔️ Python L → E → G → B tartibida qidiradi
✔️ Har bir o‘zgaruvchining “hududi” bor
✔️ global va nonlocal — kerak bo‘lsa ishlatiladi
✔️ Toza kod uchun — argument bilan ishlash yaxshiroq
Siz yozgan o‘zgaruvchi kodning hamma joyida ishlaydimi? 🤔 Yo‘q. Python har bir o‘zgaruvchiga qayerda yaratilganiga qarab ruxsat beradi. Bu tushuncha — scope deyiladi.
🧭 Python o'zgaruvchini qanday qidiradi?
Python o‘zgaruvchini 4 bosqichda qidiradi:
L → E → G → B
• Local — hozirgi funksiya ichida
• Enclosing — tashqi (nested) funksiya ichida
• Global — fayl darajasida
• Built-in — Python ichidagi tayyor nomlar (len, print, ...)
Topilmasa → ❌ NameError
📌 1. Local (eng yaqin scope)
def test():
x = 10
print(x) # ✅ ishlaydi
test()
print(x) # ❌ NameError
👉 x faqat funksiya ichida yashaydi, funksiyadan tashqarida uni tog'ridan-to'g'ri ishlata olmaysiz!
📌 2. Global
x = 5
def test():
print(x) # ✅ globaldan oladi
test()
👉 Funksiya global o'zgaruvchini muammosiz o‘qiy oladi. Lekin o‘zgartirmoqchi bo‘lsangiz global kalit so'zini ishlatish majburiy:
x = 5
def test():
global x
x += 1
test()
print(x) # 6
👉 global — tashqaridagi o‘zgaruvchini o‘zgartiradi
📌 3. Enclosing (nested funksiyalar)
def outer():
x = 10
def inner():
print(x) # ✅ tashqaridan oladi
inner()
outer()
⚠️ nonlocal ishlatish
def outer():
x = 10
def inner():
nonlocal x
x += 5
inner()
print(x) # 15
outer()
👉 nonlocal — ichki funksiya ichida tashqi funksiyaning o‘zgaruvchisini o‘zgartiradi
🧩 Xulosa
✔️ Python L → E → G → B tartibida qidiradi
✔️ Har bir o‘zgaruvchining “hududi” bor
✔️ global va nonlocal — kerak bo‘lsa ishlatiladi
✔️ Toza kod uchun — argument bilan ishlash yaxshiroq
❤2👏2👍1
🐍 Pythonda funksiya ichidan funksiya qaytarish mumkinmi? 🤯
Quyidagi kodga qarang:
🤔 Nima chiqadi?
Bir o‘ylab ko‘ring... 👇
✅ Javob:
🧠 Nima bo‘lyapti o‘zi?
create() funksiyasi oddiy qiymat emas, boshqa funksiya (lambda) qaytaryapti.
💡 Eng qiziq joyi
n = 31 yo‘qolib ketmaydi! 😳
U lambda ichida saqlanib qoladi
👉 Bu — closure deyiladi
🔥 Nega bu kuchli?
Siz dinamik funksiyalar yasay olasiz:
⚠️ E’tibor bering
❌ bu yaxshi emas (built-in max() ni bosib yuboradi)
✅ yaxshisi:
🧩 Xulosa
• Funksiya ichidan funksiya qaytarish mumkin
• Ichki funksiya tashqi o‘zgaruvchini esda saqlaydi
• Bu mexanizm → closure
• Juda foydali: filter, validator, dynamic logic
Quyidagi kodga qarang:
def create(m, n):
if m == 'Max':
return lambda v: v < n
elif m == 'Min':
return lambda v: v > n
checker = create('Max', 31)
print(checker(15)) # ?
print(checker(32)) # ?
🤔 Nima chiqadi?
Bir o‘ylab ko‘ring... 👇
✅ Javob:
True
False
🧠 Nima bo‘lyapti o‘zi?
create() funksiyasi oddiy qiymat emas, boshqa funksiya (lambda) qaytaryapti.
checker = lambda v: v < 31
💡 Eng qiziq joyi
n = 31 yo‘qolib ketmaydi! 😳
U lambda ichida saqlanib qoladi
👉 Bu — closure deyiladi
🔥 Nega bu kuchli?
Siz dinamik funksiyalar yasay olasiz:
check10 = create('Max', 10)
check50 = create('Max', 50)
print(check10(20)) # False
print(check50(20)) # True⚠️ E’tibor bering
max = create('Max', 31)❌ bu yaxshi emas (built-in max() ni bosib yuboradi)
✅ yaxshisi:
max_checker = create('Max', 31)🧩 Xulosa
• Funksiya ichidan funksiya qaytarish mumkin
• Ichki funksiya tashqi o‘zgaruvchini esda saqlaydi
• Bu mexanizm → closure
• Juda foydali: filter, validator, dynamic logic
👍4🔥3👏2❤1
🌍 FastAPI va ko‘p tilli dastur: Zarurati va imkoniyatlari
Siz FastAPI bilan backend qurayotganingizda ko‘p tilli dastur (i18n) haqida o‘ylash juda muhim. Nega?
1️⃣ Nima uchun ko‘p tilli qilish kerak?
🌐 Global auditoriya: Foydalanuvchilar bir nechta tilni biladi. Sizning API faqat bir til bilan javob qaytarsa, foydalanuvchi tajribasi buziladi.
🔒 Xabarlar va xatoliklar: Har bir error yoki success xabari foydalanuvchiga tushunarli bo‘lishi kerak.
⚡️ Professional standart: Ko‘p tilli API bugungi kunda standart hisoblanadi, ayniqsa React/Flutter frontend bilan ishlaganda.
2️⃣ FastAPI imkoniyatlari
🔹 Variant 1: gettext + .po/.mo fayllar
• Python standart kutubxonasi
• Tarjima fayllari (.po) orqali xabarlarni boshqarish
• .mo faylga kompilyatsiya qilib, tez ishlaydi
• Middleware orqali foydalanuvchi tilini aniqlash mumkin
🔹 Variant 2: Babel
• .po fayllarni yaratish va kompilyatsiya qilishni osonlashtiradi
• Sana, vaqt, valyuta formatlash imkoniyati
🔹 Variant 3: fastapi-babel yoki fastapi-i18n
• FastAPI uchun tayyor middleware
• Accept-Language header yoki query param orqali tilni aniqlaydi
🔹 Variant 4: JSON fayllar + frontend translation
• Backend faqat xabar ID yuboradi
• React / Vue / Flutter frontend foydalanuvchining tiliga mos tarjima qiladi
• Frontendda i18next bilan osongina ishlaydi
Siz FastAPI bilan backend qurayotganingizda ko‘p tilli dastur (i18n) haqida o‘ylash juda muhim. Nega?
1️⃣ Nima uchun ko‘p tilli qilish kerak?
🌐 Global auditoriya: Foydalanuvchilar bir nechta tilni biladi. Sizning API faqat bir til bilan javob qaytarsa, foydalanuvchi tajribasi buziladi.
🔒 Xabarlar va xatoliklar: Har bir error yoki success xabari foydalanuvchiga tushunarli bo‘lishi kerak.
⚡️ Professional standart: Ko‘p tilli API bugungi kunda standart hisoblanadi, ayniqsa React/Flutter frontend bilan ishlaganda.
2️⃣ FastAPI imkoniyatlari
🔹 Variant 1: gettext + .po/.mo fayllar
• Python standart kutubxonasi
• Tarjima fayllari (.po) orqali xabarlarni boshqarish
• .mo faylga kompilyatsiya qilib, tez ishlaydi
• Middleware orqali foydalanuvchi tilini aniqlash mumkin
🔹 Variant 2: Babel
• .po fayllarni yaratish va kompilyatsiya qilishni osonlashtiradi
• Sana, vaqt, valyuta formatlash imkoniyati
🔹 Variant 3: fastapi-babel yoki fastapi-i18n
• FastAPI uchun tayyor middleware
• Accept-Language header yoki query param orqali tilni aniqlaydi
🔹 Variant 4: JSON fayllar + frontend translation
• Backend faqat xabar ID yuboradi
• React / Vue / Flutter frontend foydalanuvchining tiliga mos tarjima qiladi
• Frontendda i18next bilan osongina ishlaydi
🔥2👏2😁2👍1
📡 Ngrok nima? Oddiy tushuntirish!
Agar siz dasturchi bo‘lsangiz yoki lokal server bilan ishlasangiz, ngrok sizga juda foydali bo‘lishi mumkin 👇
🔹 Ngrok — bu sizning kompyuteringizda (localhostda) ishlayotgan serverni internet orqali hammaga ochib beradigan xizmat.
💡 Ya’ni:
Sizda lokal ishlayotgan sayt yoki API bor (masalan: http://localhost:3000)
Ngrok uni quyidagicha public linkka aylantiradi:
👉 https://abc123.ngrok.io
🚀 Qachon kerak bo‘ladi?
• Telegram bot yozayotganda (webhook ulash uchun)
• Frontend va backendni test qilishda
• Boshqalarga o‘z loyihangizni ko‘rsatishda
• Mobil ilovalarni API bilan bog‘lashda
⚙️ Qanday ishlaydi?
• Ngrokni o‘rnatasiz
• Terminalda quyidagini yozasiz: ngrok http 3000
• Sizga public URL beradi — bo‘ldi!
🔐 Afzalliklari:
✅ Oson sozlanadi
✅ HTTPS avtomatik ishlaydi
✅ Real-time trafikni ko‘rish mumkin
⚠️ Eslatma:
Free versiyada link har safar o‘zgaradi.
🔥 Agar siz backend yoki bot yozayotgan bo‘lsangiz — ngrok sizning eng yaqin yordamchingiz!
Agar siz dasturchi bo‘lsangiz yoki lokal server bilan ishlasangiz, ngrok sizga juda foydali bo‘lishi mumkin 👇
🔹 Ngrok — bu sizning kompyuteringizda (localhostda) ishlayotgan serverni internet orqali hammaga ochib beradigan xizmat.
💡 Ya’ni:
Sizda lokal ishlayotgan sayt yoki API bor (masalan: http://localhost:3000)
Ngrok uni quyidagicha public linkka aylantiradi:
👉 https://abc123.ngrok.io
🚀 Qachon kerak bo‘ladi?
• Telegram bot yozayotganda (webhook ulash uchun)
• Frontend va backendni test qilishda
• Boshqalarga o‘z loyihangizni ko‘rsatishda
• Mobil ilovalarni API bilan bog‘lashda
⚙️ Qanday ishlaydi?
• Ngrokni o‘rnatasiz
• Terminalda quyidagini yozasiz: ngrok http 3000
• Sizga public URL beradi — bo‘ldi!
🔐 Afzalliklari:
✅ Oson sozlanadi
✅ HTTPS avtomatik ishlaydi
✅ Real-time trafikni ko‘rish mumkin
⚠️ Eslatma:
Free versiyada link har safar o‘zgaradi.
🔥 Agar siz backend yoki bot yozayotgan bo‘lsangiz — ngrok sizning eng yaqin yordamchingiz!
👍5❤4🔥4👏1👌1🤝1