✅ 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