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

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

Admin:
@JurabekAbdusattarov,
@pythonwithcoldboot
Download Telegram
🐍 Python: @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:
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
Live stream scheduled for
Live stream started
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)!
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👇
👍41🔥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.
🔥5👍43
🔍 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
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!”
👍53🔥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
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👍43
📌 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 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🔥21
📌 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:
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

Base64shifrlash (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.
👍42🔥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
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:
__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)
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:
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👏21
🌍 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
🔥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!
👍54🔥4👏1👌1🤝1