🧠 Pythonda Comprehension nima? Nega ishlatiladi?
Python dasturlashda comprehension — ma’lumot tuzilmalarini ixcham, tez va o‘qilishi oson tarzda yaratish usuli. U an’anaviy for sikliga qaraganda kamroq kod, ko‘proq qulaylik va yaxshi performance beradi.
Comprehensionning 4 ta asosiy turi mavjud:
🔵 1) List Comprehension
Ro‘yxat yaratishning eng mashhur usuli.
➤ Misol:
❗️ Shart bilan yozish ham mumkin:
🟢 2) Dictionary Comprehension
Lug‘atlarni tez yaratish uchun ishlatiladi.
➤ Misol:
Filtrlash bilan:
🟣 3) Set Comprehension
To‘plam (set) yaratish uchun.
➤ Misol:
🟡 4) Generator Expression (Generator Comprehension)
Xotirani juda tejamkor ishlatadi — barcha qiymatlar birdaniga emas, kerak bo‘lganda yaratiladi.
➤ Misol:
Bu ro‘yxat ham tuple ham emas — bu generator (e'tibor bering tuple emas, ko'pchilik tuple deb o'ylaydi)! Xotira kam ishlatiladi.
❓ Comprehension nega kerak? Nima yutamiz?
✔️ 1. Kod 2-3 marta qisqaradi
An’anaviy usul:
Comprehension:
✔️ 2. O‘qish va tushunish oson
Bitta qatorda nima qilinayotgani aniq ko‘rinadi.
✔️ 3. Tezroq ishlaydi (performance yaxshiroq)
Python comprehensionlarni optimallashtiradi.
✔️ 4. Xatolar kamroq bo‘ladi
append, set.add, dict[key] = value kabi funksiyalar kerak bo‘lmaydi.
❗️ Agar comprehension ishlatilmasa, nima yutqaziladi?
− Kod cho‘zilib ketadi
− Ko‘rinishi chalkash bo‘ladi
− Ba’zi hollarda sekinroq ishlaydi
− Pythonning “pythonic” uslubidan yiroqlashadi
Comprehension — bu Pythonda sodda, toza va tez kod yozishning eng muhim vositalaridan biri.
Python dasturlashda comprehension — ma’lumot tuzilmalarini ixcham, tez va o‘qilishi oson tarzda yaratish usuli. U an’anaviy for sikliga qaraganda kamroq kod, ko‘proq qulaylik va yaxshi performance beradi.
Comprehensionning 4 ta asosiy turi mavjud:
🔵 1) List Comprehension
Ro‘yxat yaratishning eng mashhur usuli.
➤ Misol:
numbers = [1, 2, 3, 4]
squares = [n*n for n in numbers]
❗️ Shart bilan yozish ham mumkin:
even = [n for n in numbers if n % 2 == 0]
🟢 2) Dictionary Comprehension
Lug‘atlarni tez yaratish uchun ishlatiladi.
➤ Misol:
kvadratlar = {n: n*n for n in range(1, 6)}Filtrlash bilan:
even_map = {n: n*n for n in range(10) if n % 2 == 0}🟣 3) Set Comprehension
To‘plam (set) yaratish uchun.
➤ Misol:
letters = {ch for ch in "hello python"}🟡 4) Generator Expression (Generator Comprehension)
Xotirani juda tejamkor ishlatadi — barcha qiymatlar birdaniga emas, kerak bo‘lganda yaratiladi.
➤ Misol:
gen = (n*n for n in range(10))
Bu ro‘yxat ham tuple ham emas — bu generator (e'tibor bering tuple emas, ko'pchilik tuple deb o'ylaydi)! Xotira kam ishlatiladi.
❓ Comprehension nega kerak? Nima yutamiz?
✔️ 1. Kod 2-3 marta qisqaradi
An’anaviy usul:
result = []
for n in range(10):
result.append(n*n)
Comprehension:
result = [n*n for n in range(10)]
✔️ 2. O‘qish va tushunish oson
Bitta qatorda nima qilinayotgani aniq ko‘rinadi.
✔️ 3. Tezroq ishlaydi (performance yaxshiroq)
Python comprehensionlarni optimallashtiradi.
✔️ 4. Xatolar kamroq bo‘ladi
append, set.add, dict[key] = value kabi funksiyalar kerak bo‘lmaydi.
❗️ Agar comprehension ishlatilmasa, nima yutqaziladi?
− Kod cho‘zilib ketadi
− Ko‘rinishi chalkash bo‘ladi
− Ba’zi hollarda sekinroq ishlaydi
− Pythonning “pythonic” uslubidan yiroqlashadi
Comprehension — bu Pythonda sodda, toza va tez kod yozishning eng muhim vositalaridan biri.
❤6👍2🔥2⚡1
🔵 Python: @property — faqat private yoki protected atributlar uchun emas!
Ko‘pchilikda shunday tushuncha bor:
“@property faqat private yoki protected atributlar bilan ishlatiladi.”
Bu — noto‘g‘ri.
Keling, to‘g‘risini tushunamiz👇
🔹 @property aslida nima uchun kerak?
@property ning vazifasi:
• atributni o‘qishda nazorat qilish (getter)
• atributga qiymat berishda nazorat qilish (setter)
• ichki kodni tashqi interfeysdan ajratish (encapsulation)
• API ni chiroyli va pythonic qilish (obj.get_price() o‘rniga obj.price)
Demak, @property — atributni boshqariladigan metodga aylantirish vositasi.
Uning private/protected bilan to‘g‘ridan-to‘g‘ri bog'liq joyi yo‘q.
🔵 Unda nega hamma @property ni private atribut bilan ishlatadi?
Buning muhim texnik sababi bor:
Atribut va metod nomi bir xil bo'lib qolishi sababli cheksiz rekursiya yuzaga keladi, buni rekursiyani oldini olish uchun ularni nomini ikki xil qilinishi mumkin ya'ni radius atributi protected yoki private ko'rinishida olinishi mumkin:
• _radius (protected)
• __radius (private)
Bu shunchaki rekursiyani oldini olish usuli.
Hech qanday majburiy qoida emas.
🟢 Property private bo‘lmasdan ham ishlaydi
Masalan, hisob-kitobli atribut:
Bu yerda private atribut umuman yo‘q, lekin property juda chiroyli ishlayapti.
🟣 Yoki faqat o‘qiladigan atribut:
Bu ham private atribut bo'lishini talab qilmaydi.
🟡 Xulosa (eng muhim)
@property — bu private atributlar uchun yaratilgan mexanizm emas.
Uning vazifasi: atributga o‘xshash interfeys orqali boshqariladigan metod yaratish.
Private/protected atributlar esa shunchaki:
• ichki qiymatni ajratish
• rekursiyani oldini olish
• inkapsulyatsiyani yaxshilash
uchun odatiy amaliyot xolos.
🟥 Qachon ishlatmaslik kerak?
❌ Juda katta va og‘ir hisob-kitob property ichida bo‘lsa
❌ Noaniq side effect bo‘lsa
❌ Atribut nomi orqali metod chaqirilayotganini yashirish zarar bo‘lsa
Bunday hollarda odatiy metod ishlatgan ma’qul.
Ko‘pchilikda shunday tushuncha bor:
“@property faqat private yoki protected atributlar bilan ishlatiladi.”
Bu — noto‘g‘ri.
Keling, to‘g‘risini tushunamiz👇
🔹 @property aslida nima uchun kerak?
@property ning vazifasi:
• atributni o‘qishda nazorat qilish (getter)
• atributga qiymat berishda nazorat qilish (setter)
• ichki kodni tashqi interfeysdan ajratish (encapsulation)
• API ni chiroyli va pythonic qilish (obj.get_price() o‘rniga obj.price)
Demak, @property — atributni boshqariladigan metodga aylantirish vositasi.
Uning private/protected bilan to‘g‘ridan-to‘g‘ri bog'liq joyi yo‘q.
🔵 Unda nega hamma @property ni private atribut bilan ishlatadi?
Buning muhim texnik sababi bor:
@property
def radius(self):
return self.radius # ❌ cheksiz rekursiya
Atribut va metod nomi bir xil bo'lib qolishi sababli cheksiz rekursiya yuzaga keladi, buni rekursiyani oldini olish uchun ularni nomini ikki xil qilinishi mumkin ya'ni radius atributi protected yoki private ko'rinishida olinishi mumkin:
• _radius (protected)
• __radius (private)
Bu shunchaki rekursiyani oldini olish usuli.
Hech qanday majburiy qoida emas.
🟢 Property private bo‘lmasdan ham ishlaydi
Masalan, hisob-kitobli atribut:
@property
def area(self):
return self.width * self.height
Bu yerda private atribut umuman yo‘q, lekin property juda chiroyli ishlayapti.
🟣 Yoki faqat o‘qiladigan atribut:
@property
def info(self):
return "User info"
Bu ham private atribut bo'lishini talab qilmaydi.
🟡 Xulosa (eng muhim)
@property — bu private atributlar uchun yaratilgan mexanizm emas.
Uning vazifasi: atributga o‘xshash interfeys orqali boshqariladigan metod yaratish.
Private/protected atributlar esa shunchaki:
• ichki qiymatni ajratish
• rekursiyani oldini olish
• inkapsulyatsiyani yaxshilash
uchun odatiy amaliyot xolos.
🟥 Qachon ishlatmaslik kerak?
❌ Juda katta va og‘ir hisob-kitob property ichida bo‘lsa
❌ Noaniq side effect bo‘lsa
❌ Atribut nomi orqali metod chaqirilayotganini yashirish zarar bo‘lsa
Bunday hollarda odatiy metod ishlatgan ma’qul.
👍2🔥1👏1
🔥 Obyekt class atributini o‘zgartirsa nima bo‘ladi?
👉 Ko‘pchilik o‘ylagandek, obyekt orqali class atributiga qiymat bersangiz, class atributi o‘zgarmaydi.
Aksincha, Python obyektga yangi atribut yaratadi. Ya'ni bu nomdagi atribut endi ham class da ham obyektda bor bo'ladi va ular boshqa boshqa.
📌 Nega shunday?
Pythonda agar obyektdan biror atribut qiymatini olmoqchi bo'lsak, atributni qidirish tartibi quyidagicha bo'ladi:
1️⃣ Avval obyekt ichida (self.dict) qidiradi (topsa shu qiymatni qaytaradi va qidiruv to'xtaydi)
2️⃣ Topilmasa — class ichidan (Class.dict) ushbu atributni qidiradi va qaytaradi
Misol:
Yuqoridagi kodda a1.x = 99 orqali xuddiki biz class atributi x ni o'zgartiryapmiz, lekin aslida unday emas. Bu holda obyekt o'ziga yangi x atribut yaratadi va shu yangi atributga 99 qiymatini beradi, Class atributi x esa o'zgarishsiz qoladi.
🧐 Xulosa:
Class atributini obyekt orqali obyekt atributini o'zgartirganday o'zgartirib bo'lmaydi, chunki u klassga tegishli narsa. Uni faqat class ni o'zi orqali yoki obyekt tomonidan @classmethod yordamida o'zgartirilishi mumkin xalos. Lekin shuni inobatga olish kerak agar obyekt class ga tegishli atributni @classmethod yordamida yaratilgan metod orqali o'zgartirsa bu o'zgarish ushbu class dan yaratilgan hamma obyektlarga ta'sirini o'tkazadi.
👉 Ko‘pchilik o‘ylagandek, obyekt orqali class atributiga qiymat bersangiz, class atributi o‘zgarmaydi.
Aksincha, Python obyektga yangi atribut yaratadi. Ya'ni bu nomdagi atribut endi ham class da ham obyektda bor bo'ladi va ular boshqa boshqa.
📌 Nega shunday?
Pythonda agar obyektdan biror atribut qiymatini olmoqchi bo'lsak, atributni qidirish tartibi quyidagicha bo'ladi:
1️⃣ Avval obyekt ichida (self.dict) qidiradi (topsa shu qiymatni qaytaradi va qidiruv to'xtaydi)
2️⃣ Topilmasa — class ichidan (Class.dict) ushbu atributni qidiradi va qaytaradi
Misol:
class A:
x = 10 # sinf atributi
a1 = A()
a2 = A()
a1.x = 99 # obyekt orqali qiymat berildi
print(a1.x) # 99 → obyekt atributi
print(a2.x) # 10 → sinf atributi o'zgarmadi
print(A.x) # 10 → sinf atributi o'zgarmadi
Yuqoridagi kodda a1.x = 99 orqali xuddiki biz class atributi x ni o'zgartiryapmiz, lekin aslida unday emas. Bu holda obyekt o'ziga yangi x atribut yaratadi va shu yangi atributga 99 qiymatini beradi, Class atributi x esa o'zgarishsiz qoladi.
🧐 Xulosa:
Class atributini obyekt orqali obyekt atributini o'zgartirganday o'zgartirib bo'lmaydi, chunki u klassga tegishli narsa. Uni faqat class ni o'zi orqali yoki obyekt tomonidan @classmethod yordamida o'zgartirilishi mumkin xalos. Lekin shuni inobatga olish kerak agar obyekt class ga tegishli atributni @classmethod yordamida yaratilgan metod orqali o'zgartirsa bu o'zgarish ushbu class dan yaratilgan hamma obyektlarga ta'sirini o'tkazadi.
❤2👍2🔥1👏1
🐍 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