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 Descriptors – Mukammal Tushuncha

📌 Descriptor – bu __get__, __set__, yoki __delete__ metodlaridan birini yoki bir nechtasini implement qilgan klassdir. U orqali siz klass atributlariga kirishni nazorat qilishingiz mumkin.

📘 Qisqacha ta’rif:

class Descriptor:
def get(self, instance, owner):
...
def set(self, instance, value):
...
def delete(self, instance):
...


Ushbu metodlar:

__get__ → atributni o‘qishda,
__set__ → qiymat yozishda,
__delete__ → atributni o‘chirishda chaqiriladi.

🔧 Amaliy misol: Atributga faqat musbat son yozish

class PositiveNumber:
def init(self, initial=0):
self.value = initial

def get(self, instance, owner):
return self.value

def set(self, instance, value):
if value < 0:
raise ValueError("Faqat musbat son bo'lishi mumkin.")
self.value = value

def delete(self, instance):
del self.value

class MyClass:
age = PositiveNumber()

obj = MyClass()
obj.age = 25 # OK
obj.age = -5 # ValueError


🔥 Qachon descriptor ishlatamiz?

• Validatsiya qilish (masalan, PositiveNumber)
• Read-only atributlar yaratish
• Lazy-loading (kerak bo‘lganda yuklash)
• Type-checking, logger, audit trail, va boshqalar

🚨 Ehtiyot bo‘ling: Memory leak
Agar descriptorlar noto‘g‘ri implement qilinsa (self.valueni barcha obyektlar uchun umumiy saqlasa), bu memory leak (xotira sizib chiqishi) keltirib chiqarishi mumkin. Har bir instansiya uchun alohida instance.__dict__da saqlash eng yaxshi yondashuv.

📌 Yakuniy xulosa
Descriptor – kuchli, lekin nazoratli foydalanish kerak bo‘lgan vosita. U orqali klass atributlariga kirish ustidan to‘liq boshqaruv olasiz.

qo'shimcha ma'lumot komentariyada👇
Exceptions (Istisnolar) nima?

Exception
– dastur bajarilishi vaqtida yuzaga keladigan xatolik bo‘lib, dasturning ishini to‘xtatadi yoki qaysidir qismi noto'g'ri ishlashiga olib keladi.

Masalan:

a = 10
b = 0
c = a / b # ZeroDivisionError: division by zero

Bu yerda b = 0, shuning uchun bo‘lish mumkin emas va ZeroDivisionError xatoligi yuz beradi.
Exception Handling (Xatolarni ushlash)

Pythonda try, except, finally, va else bloklari yordamida xatoliklar bilan ishlash, xatolik yuz berganda nimalar qilishni beglilash mumkin.

Misol:

try:
number = int(input("Son kiriting: "))
print(10 / number)
except ZeroDivisionError:
print("0 ga bo‘lish mumkin emas!")
except ValueError:
print("Faqat son kiriting!")
finally:
print("Dasturning bu qismi har doim bajariladi.")
Custom Exceptions (Maxsus Istisnolar)

Ba'zida biz qilayotgan dastur uchun, bizni holatimizga mos xatoliklar kerak bo‘ladi va biz uni o'zimiz yasashimiz mumkin.
Buning uchun Exception klassidan meros olib yangi klass yaratamiz.


class MyCustomError(Exception):
def init(self, message):
self.message = message
super().init(self.message)

def tekshir(yosh):
if yosh < 18:
raise MyCustomError("Yosh 18 dan kichik bo'lishi mumkin emas!")
else:
print("Kirish ruxsat etildi.")

try:
tekshir(16)
except MyCustomError as e:
print(f"Xatolik: {e}")
🔹 Cirq — Googlening kvant hisoblash kutubxonasi

Cirq — bu Google tomonidan ishlab chiqilgan kutubxona bo‘lib, kvant hisoblash sohasida ishlash uchun mo‘ljallangan. U Noisy Intermediate Scale Quantum (NISQ) tizimlari uchun kvant zanjirlarini (circuit) yaratish, tahrirlash va ishga tushirish imkonini beradi.

📌 NISQ — bu 50–100 kubitga ega bo‘lgan va yaqin yillarda amalda foydalanilishi mumkin bo‘lgan kvant kompyuterlar sinfi.

Cirq yordamida siz:

• Kvant zanjirlarini aniqlashingiz va ularni klassik kompyuterlarda simulyatsiya qilishingiz;
• Tayyorlangan zanjirlarni haqiqiy kvant apparatlarida ishga tushirishingiz mumkin.

🔍 Dastur natijalari odatda gistorgramma ko‘rinishida bo‘ladi:

Kalitlar — o‘lchovning mumkin bo‘lgan natijalari;
Qiymatlar — ushbu natija nechta marta kuzatilganini bildiradi.

💡 Kvant hisoblash — kelajak texnologiyalaridan biri. Cirq bilan esa bu kelajakni hozirdan sinab ko‘rish mumkin! 🚀
💻 Python + WebTexnologiyalar = Pywebview

Siz Python yordamida desktop ilovalar yaratmoqchimisiz, lekin GUI bilan bosh qotirmoqchi emassiz? 🤔

Pywebview – bu kichik, ammo qudratli kutubxona:

• HTML, CSS va JavaScript yordamida interfeys yaratish mumkin
• OS-ning ichki web-dvigatelidan foydalanadi (Windows, macOS, Linux)
• Oddiy web-sahifani desktop oynasida ochish oson

Yuqoridagi kodning natijasida (paydo bo'ladigan oyna komentda 👇):
Oyna paydo bo‘ladi
Google sahifasi ochiladi

Foydali jihatlar:

• Web-ilovalarni desktopga oson ko‘chirish
• Python va JS ni integratsiya qilish
• Lokal HTML yoki onlayn sahifalarni ishlatish

Yana bir foydali tomoni:
• Siz brauzerda iz qoldirishni xoxlamaysiz!
👍1
🚀 Python GILsiz: Ko‘p oqimlilikning yangi davri

Python 3.13 da tajriba sifatida Global Interpreter Lock (GIL) ni o‘chirib qo‘yish imkoniyati paydo bo‘ldi.
GIL — Pythonning yillar davomida haqiqiy ko‘p oqimli ishlashini cheklab kelgan mexanizmi edi.

🔬 Endi odatiy va free-threaded (GILsiz) versiyalarni solishtirish mumkin.
CPU bilan bog‘liq og‘ir vazifalarda 4 ta oqim ishlatilganda 3-4 baravar tezlik oshishi kuzatilgan.

⚠️ Lekin buning narxi bor:

• Xotira boshqaruvi murakkablashadi
• Yangi garbage collector tizimi kerak bo‘ladi
• Ba’zi obyektlar “o‘lmas” bo‘lib qoladi

📅 Hozircha free-threaded Python ixtiyoriy, lekin Python 3.14 dan boshlab standart bo‘lishi mumkin.
Asosiy savol — hamjamiyat va kutubxonalar qanchalik tez moslashadi?
zip() — Pythonda parallel iteratsiya qilish vositasi 🔗🐍

zip() — bu Python’ning ichki funksiyasi bo‘lib, bir nechta iteratsiya qilinadigan obyektlarni (list, tuple va boshqalar) elementlarini juftlab birlashtiradi.

📌 Oddiy misol:
names = ["Ali", "Vali", "Hasan"]
ages = [25, 30, 28]

for name, age in zip(names, ages):
print(f"{name} — {age} yoshda")


Natija:
Ali — 25 yoshda  
Vali — 30 yoshda
Hasan — 28 yoshda


💡 Asosiy xususiyatlar:

1. Eng qisqa uzunlik bo‘yicha ishlaydi — ro‘yxatlar uzunligi turlicha bo‘lsa, eng qisqa uzunlikka qarab kesiladi.
2. list() bilan ro‘yxatga, dict bilan lug'atga aylantirish mumkin:
pairs = list(zip(names, ages))
print(pairs) # [('Ali', 25), ('Vali', 30), ('Hasan', 28)]

my_dict = dict(pairs)
print(my_dict) # {'Ali': 25, 'Vali': 30, 'Hasan': 28}


3. * yordamida ajratish mumkin:
unzipped_names, unzipped_ages = zip(*pairs)
print(unzipped_names) # ('Ali', 'Vali', 'Hasan')


Foydali: parallel ro‘yxatlarni bir vaqtda aylanish, juftliklar yaratish, CSV ma’lumotlarini bog‘lash va boshqalar.
IceCream — Pythonda oddiy va qulay debug vositasi 🍦🐍

IceCream — bu kodni oddiy va samarali tarzda debug qilish uchun mo‘ljallangan kutubxona.
print() dan foydalanish o‘rniga, IceCream kutubxonasidagi ic() funksiyasi yordamida o‘zgaruvchilarni, ifodalarni va bajarilishni bitta chaqiriqda tekshirishingiz mumkin.

🔹 Natija:
ic| result: 6


Bu yerda ic| — IceCream chiqishini bildiradi, result: 6 esa o‘zgaruvchi nomi va qiymatini ko‘rsatadi.

💡 IceCream:

• Har qanday joyda ishlaydi — web-dasturlash, ilmiy hisob-kitob, ma’lumotlar tahlili va boshqalar.
• print() ga qaraganda ancha ixcham va qulay.

📦 O‘rnatish:
pip install icecream
Bottleneck — NumPyni chaqqonlashtiruvchi kutubxona ⚡️🐍

Bottleneck — bu NumPy usullarini 25 baravargacha tezlashtiruvchi Python kutubxonasi, ayniqsa massivda NaN qiymatlar bo‘lsa juda foydali.

📌 Misol:
Rasmda biz 1000×10 o‘lchamdagi tasodifiy sonlardan iborat 2D massiv yaratamiz. So‘ngra move_mean funksiyasi yordamida har bir qatorda skolzyashiy o‘rtacha (moving average) hisoblaymiz.

• window → necha ta qiymat o‘rtacha hisobga kiritilishini belgilaydi.
• axis → qaysi yo‘nalishda hisoblashni ko‘rsatadi (axis=1 → har bir qatorda hisoblash).

💡 Bottleneck katta hajmdagi ma’lumotlarni tez va samarali qayta ishlashda ayniqsa foydali.
Molten — Python’da zamonaviy API framework ⚡️🐍

Molten — bu zamonaviy, modulga asoslangan va testlashga qulay API yaratish uchun mo‘ljallangan Python framework.
U quyidagi imkoniyatlarni taqdim etadi:

• RESTful API lar yaratish
• Modulli tuzilma
• Yaxshi testlash imkoniyati
• Oddiy va tushunarli sintaksis

📌 Misol: Rasmdagi kodda bitta / marshrutga ega oddiy web-ilova yaratiladi. U JSON formatida salomlashuv xabarini qaytaradi. Dastur 8000-portda lokal serverda ishga tushiriladi.

🔹 Ishga tushirish:
pip install molten
python app.py



🔹 Natija: Brauzerda http://localhost:8000 ga kirsangiz:
{"message": "Salom, Molten!"}


💡 Molten — kichik, tez va modulga asoslangan API lar yaratish uchun ajoyib tanlov.
2👍1
🔮 Python: __repr__ metodi

__repr__ — bu Pythondagi magik metod bo‘lib, obyektning matn ko‘rinishini aniqlaydi.
U obyektni repr() funksiyasi orqali yoki oddiygina print() orqali chiqarishda ishlatiladi.

👉 Nega kerak?

1. Obyekt haqida foydali ma’lumot chiqaradi.
2. Oddiy <Book object at 0x12345> ko‘rinishidan ko‘ra aniqroq.
3. Debug qilish jarayonida juda qulay.

📝 Misol:
class Book:
def __init__(self, title, author, year):
self.title = title
self.author = author
self.year = year

def __repr__(self):
return f"Book(title='{self.title}', author='{self.author}', year={self.year})"

kitob = Book("1984", "George Orwell", 1949)

print(kitob) # Book obyektining ko‘rinishini chiqaradi
print(repr(kitob)) # Xuddi shunday ishlaydi



🖥 Natija:
Book(title='1984', author='George Orwell', year=1949)
Book(title='1984', author='George Orwell', year=1949)



Shunday qilib, __repr__ obyektlaringizni o‘qilishi oson va tushunarli ko‘rinishda chiqarishga yordam beradi.
🟢 SQLAlchemyda lazy yuklash strategiyalari (misollar bilan)

Keling, User va Address jadvallaridan foydalanib ko‘ramiz:
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String)
addresses = relationship("Address", back_populates="user", lazy="...")

class Address(Base):
__tablename__ = "addresses"
id = Column(Integer, primary_key=True)
email = Column(String)
user_id = Column(Integer, ForeignKey("users.id"))
user = relationship("User", back_populates="addresses")


🔹 1. lazy="select" (default)

Bog‘liq obyekt faqat chaqirilgandagina yuklanadi, agar chaqirilmasa yuklab o'tirilmaydi.
users = session.query(User).all()  
# SELECT * FROM users

for user in users:
print(user.addresses)
# Har bir user uchun alohida so‘rov:
# SELECT * FROM addresses WHERE user_id = ?

👉 10 ta foydalanuvchi bo‘lsa → 1 + 10 ta query.
Bu N+1 muammo.

🔹 2. lazy="joined"

SQLAlchemy JOIN orqali hammasini birdan yuklaydi, ya'ni bitta so'rovi o'zida tablitsalarni birlashtirib bitta tablitsa sifatida yuklab oladi.
users = session.query(User).all()  
# SELECT users.*, addresses.*
# FROM users LEFT OUTER JOIN addresses ON users.id = addresses.user_id

👉 Faqat 1 ta query.
Har doim manzillar kerak bo‘lsa yaxshi.
Katta jadvalda User qatorlari ko‘payib ketishi mumkin, chunki dublikat muammosi bor.

🔹 3. lazy="subquery"

Avval foydalanuvchilar olinadi, keyin subquery bilan manzillar.
users = session.query(User).all()  
# SELECT * FROM users
# SELECT addresses.* FROM addresses
# WHERE addresses.user_id IN (subquery)

👉 Umumiy 2 ta query.
JOINdagi duplication muammosini hal qiladi.
Hamma manzillarni birdan yuklaydi.

🔹 4. lazy="selectin"

Avval foydalanuvchilar olinadi. Keyin manzillar IN (...) query orqali yuklanadi.
users = session.query(User).all()  
# SELECT * FROM users
# SELECT addresses.* FROM addresses
# WHERE addresses.user_id IN (1, 2, 3, ..., N)

👉 2 ta query (subquery emas, IN ishlatiladi).
Juda samarali va N+1 muammosini hal qiladi.


📌 Xulosa:

1. select → kerak bo‘lganda, lekin katta ro‘yxatda sekin.
2. joined → har doim kerak bo‘lsa, tezroq.
3. subquery → JOIN duplication muammosidan qochish uchun.
4. selectin → eng balansli va samarali usul.
1
Pythondagi inf (Infinity) — qisqa tushuntirish

inf (infinity) — bu cheksizlikni bildiruvchi maxsus son. U oddiy raqam emas, balki matematik cheksizlikni ifodalaydi.

👉 Pythonda uni olish yo‘llari:
float('inf')      # ijobiy cheksizlik
float('-inf') # manfiy cheksizlik
import math
math.inf # ijobiy cheksizlik


Asosiy xossalari:

inf istalgan real sondan katta, -inf esa istalgan sondan kichik
• Hisoblashda qatnashsa, natija odatda inf bo‘lib qoladi (inf + 1 = inf)
• Ayrim amallar nan (Not-a-Number) qaytaradi: inf - inf, 0 * inf

Qayerda ishlatiladi?

Sentinel qiymat sifatida: masalan, eng kichik qiymatni qidirishda boshlang‘ich qiymat qilib float('inf') qo‘yiladi
Matematik hisoblarda va cheksizlik bilan ishlovchi algoritmlarda

👉 Xulosa: inf — Pythondagi maxsus qiymat bo‘lib, cheksizlikni ifodalaydi va ko‘p hollarda matematik yoki algoritmik vazifalarda qulay “cheksiz katta/kichik” sifatida qo‘llaniladi.
Batafsil komentariyada 👇
📊 Pygal — SVG formatida grafiklar kutubxonasi

Pygal — bu Pythondagi ma’lumotlarni vizualizatsiya qilish kutubxonasi.
U turli xil interaktiv grafiklar yaratishga imkon beradi:

1. chiziqli (line chart)
2. ustunli (bar chart)
3. doiraviy (pie chart) va boshqalar.

📝 Misol:
import pygal

# Chiziqli diagramma obyektini yaratamiz
line_chart = pygal.Line()
line_chart.title = 'Brauzer ulushi (%)'
line_chart.x_labels = ['2016', '2017', '2018', '2019']

line_chart.add('Chrome', [56, 61, 65, 69])
line_chart.add('Firefox', [30, 25, 20, 17])
line_chart.add('Edge', [5, 7, 8, 10])

line_chart.render_to_file('browsers.svg')


Natijada SVG fayl hosil bo‘ladi (browsers.svg), uni brauzerda ochib ko‘rsangiz, interaktiv grafik chiqadi.

🔎 Afzalliklari:

1. SVG formatida bo‘lgani uchun grafiklar sifatini yo‘qotmaydi.
2. Interaktivlik (ustiga olib borilganda qiymatlar ko‘rinadi).
3. Juda sodda foydalanish.

Natijasini komentariyada ko'rishingiz mumkin:👇
🔥 Fire — Python uchun CLI generator

Fire — bu Python’da yozilgan istalgan obyekt (funksiya, klass, modul) dan avtomatik tarzda CLI (Command Line Interface) yaratib beradigan kutubxona.

👉 Asosiy foydasi:

1. Kodni tezroq debug qilish
2. Oddiy funksiyalarni terminaldan chaqirish
3. Python kodini qo‘shimcha ish qilmasdan CLI dasturiga aylantirish

Terminalda ishga tushurish:

python script.py --ism=Ali


Natija:
Salom Ali!


Ko‘rib turganingizdek, Fire funksiyadan avtomatik buyruqlar satri interfeysi yasaydi.
🔥1
Pampy — Pythonda Pattern Matching kutubxonasi 🐍

Pampy — bu pattern matching (namunaga moslashtirish) imkonini beruvchi kutubxona bo‘lib, kod yozishni sodda va tushunarli qiladi. Uni turli vaziyatlarda ishlatish mumkin:

• turli ma’lumot turlarini qayta ishlash
• rekursiv funksiyalarni yaratish
• va boshqa ko‘plab holatlar

Quyidagi misolda Pampy kutubxonasidagi match funksiyasi argument n ni turli namunalar bilan solishtiradi:

1️⃣ Agar n == 1 bo‘lsa → 1 qaytaradi.
2️⃣ Agar n == 2 bo‘lsa → 1 qaytaradi.
3️⃣ Agar yuqoridagi holatlarga mos kelmasa (_ belgisi bilan belgilanadi) → funksiya o‘zini x-1 va x-2 bilan rekursiv chaqiradi va natijalarni qo‘shadi.

📌 Misol: fibonacci(6) chaqirilsa, natija 8 chiqadi, chunki 6-chi Fibonachchi soni 8 ga teng.

💡 Pampy — kodni chiroyli, qisqa va o‘qilishi oson qilishga yordam beradi.
📌 Ellipsis (...) — Pythondagi kam ma’lum, lekin foydali ifoda

Pythonda ... uchta nuqta — bu Ellipsis (EllipsisType) deb nomlanadi. Bu — maxsus obyekt bo‘lib, ko‘p joylarda shablon, to‘ldiruvchi, yoki placeholder sifatida ishlatiladi.

🧠 1. Asosiy vazifasi"hozircha bu yerga tegmang"
... ifodasi, ko‘pincha hali yozilmagan kod, metod yoki funksiya joyiga vaqtincha qo‘yiladi:


def fly(self) -> None:
...

class UserRepository:
def get_user(self, user_id: int) -> dict:
...

🔍 raise NotImplementedError o‘rniga ishlatiladigan yengil variant. Ko‘pincha interface, abstract klasslarda yoki test/loyihalash jarayonida qo‘llaniladi.

🧩 2. NumPy’da slicing uchun
NumPy kutubxonasida ... ko‘p o‘lchovli massivlarda indekslash uchun ishlatiladi:


import numpy as np

matrix = np.zeros((3, 4, 5))
print(matrix[0, ...]) # = matrix[0, :, :]

💡 ... — qolgan barcha o‘lchovlar o‘rniga : degani. Juda qulay!

🧰 3. Custom ishlatishda: Ellipsis bu oddiy obyekt!

print(...) # Ellipsis
print(type(...)) # <class 'ellipsis'>
print(... is Ellipsis) # True

Siz ... obyektini o‘z funksiyalaringizda ham shart sifatida qo‘llashingiz mumkin:


def custom_func(x):
if x is ...:
return "No value provided"
return x

custom_func(...) # "No value provided"



🧵 Xulosa:
... — Pythonda kichik, lekin juda qulay sintaktik imkoniyat:

Kodni vaqtincha to‘ldirish (interface, abstract metodlar)
NumPy indekslashni soddalashtirish
O‘z shartlaringizda maxsus flag sifatida ishlatish


🔔 P.S. Tip anotatsiyalarda ham ishlatiladi:


def func(x: int = ...) -> None:
...

Bu x majburiy argument, lekin qiymatni keyinroq belgilayman degani (masalan, pydantic, FastAPIda).
🤣1
💻 Python yordamida dollar va yevro kursini bilib oling! 💵💶

📌 O‘zbekiston Markaziy Banki ochiq API orqali istalgan valyutaning so‘mga nisbatan kursini olish mumkin. Kod juda oddiy:
import requests

# USD kursi
usd = requests.get("https://cbu.uz/oz/arkhiv-kursov-valyut/json/USD/").json()[0]["Rate"]
print(f"1 USD = {usd} UZS")

# EUR kursi
eur = requests.get("https://cbu.uz/oz/arkhiv-kursov-valyut/json/EUR/").json()[0]["Rate"]
print(f"1 EUR = {eur} UZS")


🔎 Natija:
1 USD = 12354.65 UZS
1 EUR = 14384.52 UZS


⚡️ Eng muhimi — kurslar to‘g‘ridan-to‘g‘ri Markaziy Bankdan olinadi va doim yangilanib turadi!
👍1