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
Class (sinf) – obyektlar uchun andoza

Class – bu siz yaratmoqchi bo‘lgan obyektlar (narsalar) uchun qolip (shablon).

Misol:

class Car:
def __init__(self, brand, color):
self.brand = brand
self.color = color

def drive(self):
print(f"{self.color} {self.brand} yurmoqda.")


Obyekt yaratish:

my_car = Car("Tesla", "oq")
my_car.drive() # oq Tesla yurmoqda.
👍1🔥1
#oddiy_tilda #inheritance
Meros olish (inheritance) o'zi nima, qaydan kelib qoldi endi bu tushuncha?

Meros olish — bu yangi klass yaratishda, avvalgi klassdagi kodni qayta yozmasdan foydalanish imkonini beradi. Bu kodni takrorlamaslik, modullikni saqlash va kodni boshqarishni osonlashtirish uchun kerak.

Bir qarasa kodni takrorlamaslik uchun klass ishlatiladi deysizlar, bir qarasa meros olish kodni takrorlamaslik uchun kerak deysizlar, sizlar hazillashyapsizlarmi?

Yo'q albatta biz hazillashmayapmiz, siz haqsiz klass kodni qayta yozmaslikni ta'minlaydi, takrorlanishlarni oldini oladi, lekin biz meros olishni ham bilsak klassni o'zi bilan erisholmagan soddalashtirishlarni amalga oshiramiz.

Qanday qilib? Klass misolida ko'rgandik mingta odamni dasturda yaratishni va takrorlanishlarni oldini olish maqsadida ular uchun shablon hisoblangan inson degan sinf yaratgandik. Shu orqali kod yozishdagi takrorlanishlarni oldini olgandik, ishni tezlashtirgandik, lekin meros olish nimaga kerak?

Xuddi shu misolga qaytsak, biz dasturda mingta odamning obyektini yaratmoqchimiz, har birining kodini alohida yozmaslik uchun inson degan klass yaratdik va mingta odam uchun ham umumiy bo'lgan xususiyatlarni shu inson klassida jamladik, va bu ishimizni yengillashtirdi. Endi ishimizni bundan ham yengillashtirish imkoni bormi desak ha va bu meros olish orqali amalga oshiriladi:

mingta odam avvalo inson degan sinfga tegishli, lekin biz ularni yana sinf ichidagi sinflarga bo'lsak bo'ladi, ya'ni inson degan sinfni yana o'qituvchilar, duratgorlar, fudbolistlar sinflariga (class lari) bo'lsak bo'ladi.

Xop sinfni yana sinflarga bo'ldik ham deylik, biz inson degan sinfda hammaga umumiy bo'lgan xususiyatlarni jamlagandik, lekin endi biz o'qituvchi sinfini yaratmoqchimiz va faqatgina o'qituvchilar uchun umumiy bo'lgan xususiyatlar uchun shablon (class) yaratmoqchimiz. Shunda hamma insonlar uchun umumiy bo'lgan xususiyatlarni bu sinfda qayta yozmaslik uchun inson sinfidan meros qilib olamiz, meros qilib olishimiz tufayli endi o'qituvchi sinfi ichida hech nima yozmasak ham inson sinfi nimaga xususiyat va metodlarga (klassga tegishli bo'lgan funksiyalar) ega bo'lsa o'qituvchi sinfi ham shularga ega bo'ladi, va biz qo'shimcha qilib faqat o'qituvchilarga tegishli bo'lgan umumiy xususiyatlarni shu o'qituvchi sinfida shablon qilib yaratvolamiz.

Shunday qilib biz o'qituvchi klassidan obyekt yaratsak, bu obyekt inson sinfidagi xususiyatlarga ham ega bo'ladi. Shunday qilib kod yozishni yanada soddalashtirish va tezlashtirishga muvaffaq bo'lamiz.

class orqali obyektlar uchun shablon yaratgandik, meros olish orqali shu shablon class ni boshqa class lar uchun shablon sifatida ishlatsak bo'ladi!

Post uzun bo'lib ketgan bo'lsa uzur, yaxshiroq tushintirishga harakat qildim. Foydali bo'lgan bo'lsa reaksiya qoldirishni 👍 va do'stlarga ulashishni unutmang!
👍1
👨‍👦‍👦 Inheritance (meros olish) – boshqa classdan xususiyatlarni olish

Inheritance yordamida bir class boshqa classdan funksiya va xususiyatlarni meros oladi, ya’ni takror yozmasdan foydalanish mumkin.

Misol:

# Superklass (umumiy klass)
class Transport:
def __init__(self, nomi, tezlik, yoqilgi):
self.nomi = nomi
self.tezlik = tezlik # km/soat
self.yoqilgi = yoqilgi

def harakatlan(self):
print(f"{self.nomi} {self.tezlik} km/soat tezlikda harakatlanmoqda.")

def toxta(self):
print(f"{self.nomi} to‘xtadi.")

def info(self):
print(f"Nomi: {self.nomi}, Tezlik: {self.tezlik} km/soat, Yoqilg‘i: {self.yoqilgi}")

# Subklasslar (avtomobil, avtobus, mototsikl) Transport klassidan meros oladi

class Avtomobil(Transport):
def __init__(self, nomi, tezlik, yoqilgi, eshiklar_soni):
super().__init__(nomi, tezlik, yoqilgi)
self.eshiklar = eshiklar_soni

def info(self):
super().info()
print(f"Eshiklar soni: {self.eshiklar}")

class Avtobus(Transport):
def __init__(self, nomi, tezlik, yoqilgi, yolovchilar_soni):
super().__init__(nomi, tezlik, yoqilgi)
self.yolovchilar = yolovchilar_soni

def info(self):
super().info()
print(f"Yo‘lovchilar sig‘imi: {self.yolovchilar} kishi")

class Mototsikl(Transport):
def __init__(self, nomi, tezlik, yoqilgi, turi):
super().__init__(nomi, tezlik, yoqilgi)
self.turi = turi # Masalan: sport, klassik

def info(self):
super().info()
print(f"Mototsikl turi: {self.turi}")


Avtomobil, Avtobus va Mototsikl classlari Transport classidan hamma transportlar uchun umumiy bo'lgan nomi, tezlik, yoqilgi kabi atributlar va harakatlan, toxta, info kabi metodlarni meros qilib oldi, keyin hammasi o'ziga tegishli bo'lgan atributlarni qo'shdi va info metodiga qo'shimcha kiritdi.
👍1
#oddiy_tilda #polymorphism
Navbatdagi razbor qilinadigan atama bu "Polymorphism". Tayyormisizlar?

Bir xil nomdagi metod yoki funksiyaning turli klasslarda har xil ishlashi - polymorphism hisoblanadi.

Tushunmadim, shu xalosmi? Bu nima degani o'zi, nimaga kerak?

Yana tasavvur qilamiz, oxirgi paytda ishimiz shu bo'lib qoldi, tasavvur yaxshi narsada😁!

Aytaylik siz katta bir korxonaning egasisiz, va bu korxonada har xil kasbli mutaxassislar bor, ularning hammasini ishi bor va bu ishlar har xil, bugalter pul kirdi chiqdisini hisoblaydi, sotuvchi sotuv bilan shug'ullanadi, omborchi mahsulotlarni omborga joylashtiradi va hakozo. Eng muhimi har kuni ular ishni sizni buyrug'ingizdan keyin boshlaydi.

Endi sizga savol siz ularni hammasiga alohida buyruq berasizmi:

1. bugalterga - sen pullarni hisob kitob qilishni boshla, sotuvchiga - sen dokondagi hamma mahsulotlarni sotuvini boshla, omborchiga - sen tayyor mahsulotlarni omborga joylashtir va sotuvchiga yetkazib tur, va hakozo.
2. yoki bitta buyruq bilan hamma ishini boshlasin deysizu, hamma boshqalarning ishidan farqli bo'lgan o'zini ishini qiladi. Vaholangki ularning hammasi boshqa-boshqa ish qiladi lekin buyruq bitta.

Agar siz ikkinchi holatni tanlasangiz, bu yaxshi va bu holatga polymorphism deyiladi albatta. Yoki oddiy til bilan aytganda:

"Bitta buyruq — turli shakllarda bajarilishi" polymorphismdir!

Boshqa misol, faraz qiling hayvonlarga “ovoz chiqar” degan buyruq beriladi:

• It: “Vov-vov” deydi.
• Mushuk: “Miyov” deydi.
• Sigir: “Moo” deydi.

Ularning har biriga bir xil buyruq berildi – ovoz chiqar – lekin har biri o‘ziga xos javob berdi.
Bu — polymorphism!

Agar ma'lumot foydali bo'lgan bo'lsa reaksiya qoldirishni unutmang! Do'stlarga ulashishni ham!
👍2🔥1
🔁 Polymorphism (ko‘p shakllilik) – bir xil metod har xil sinflarda boshqacha ishlashi

Polymorphism — bu obyektga yo‘naltirilgan dasturlashda bir xil nomdagi metod yoki funksiyaning turli klasslarda har xil ishlashi degani.

Misol:

class Cat:
    def speak(self):
        print("Miyov!")

class Cow:
    def speak(self):
        print("Mo-o-o!")

def animal_sound(animal):
    animal.speak()

animal_sound(Cat())   # Miyov!
animal_sound(Cow())   # Mo-o-o!


speak() har xil sinflarda har xil natija berdi – bu polimorfizm.
1👍1🔥1
O'rgatilayotgan bilimlarni sinash uchun t.me/python_fastapi_uz_quiz kanalini yaratib qo'ydik, xoxlasanglar foydalanishinglar mumkin!
👍2🔥2
🌀 Generator nima?

Generator — bu maxsus funksiya bo‘lib, u katta hajmdagi ma’lumotlarni bitta-bitta (navbatma-navbat) yaratadi. U yield kalit so‘zi yordamida ishlaydi.

Bu xuddi televizordan tomosha qilish o‘rniga, bir vaqtning o‘zida faqat bir sahifasini chiqaradigan kitobga o‘xshaydi. Har safar kerak bo‘lganda navbatdagi sahifa (qiymat) chiqariladi.

🎯 Nega generator kerak?

Oddiy funksiya:

def list_numbers():
return [1, 2, 3]

print(list_numbers())

Bu funksiya butun ro‘yxatni birdan qaytaradi va xotirada saqlaydi. Katta ro‘yxat bo‘lsa — xotira ko‘p ishlatiladi.

Generator:

def gen_numbers():
yield 1
yield 2
yield 3

for num in gen_numbers():
print(num)

Bu funksiya esa har safar bittadan qiymat chiqaradi va xotirani tejaydi.
👍2🔥1
Agar generatorni kimgadir oddiy tilda tushuntirishim qiziq bo'lsa reksiya qoldirsin, hech bo'lmaganda bitta odam uchun foydali bo'lsa tushuntirib beraman, oddiy tilda o'xshatish orqali 👍
🔥2👍1😁1
🔁 yield nima?

• return funksiyani to‘xtatadi va qiymatni beradi.

• yield esa bir marta qiymat beradi, ammo funksiyani to‘xtatmaydi.

• Keyingi safar chaqirilganda, yield dan keyingi qatorlardan davom etadi.

🔧 Oddiy generator misoli

def sonlar():
print("1 chi son")
yield 1
print("2 chi son")
yield 2
print("3 chi son")
yield 3

for s in sonlar():
print("Chiqarildi:", s)


Natija:

1 chi son
Chiqarildi: 1
2 chi son
Chiqarildi: 2
3 chi son
Chiqarildi: 3
👍3
📦 Generator qanday foydali?

Masalan, 1 millionta sonni chiqarish:

def million():
for i in range(1_000_000):
yield i

# Bu juda katta ro'yxat bo'lishi mumkin, ammo generator xotirani tejaydi
for i in million():
if i == 5:
break
print(i)

Bu yerda xotirada 1 millionta son saqlanmaydi (oddiy ro'yxatda bo'lsa 1 millionta son operativ xotirada saqlanib turadi), faqat kerakli sonlar yaratiladi.

🧪 Generator expression (generator ifodasi)
Bu generatorning qisqa yozilish usuli:


gen = (x * x for x in range(3))
for i in gen:
print(i)


Natija:
0
1
4

Bu list comprehension ga o‘xshaydi: [x*x for x in range(3)], lekin generator xotirani tejaydi.
👍3
Isoqjanov Ilyos | Python
Agar generatorni kimgadir oddiy tilda tushuntirishim qiziq bo'lsa reksiya qoldirsin, hech bo'lmaganda bitta odam uchun foydali bo'lsa tushuntirib beraman, oddiy tilda o'xshatish orqali 👍
Bitta bo'lsa ham reaksiya qoldirilibdi, shuning uchun o'xshatish:

1. oddiy ro'yxat va generatorni farqi haqida:

oddiy ro'yxat bizga kerakli qiymatlarni hammasini bittada olib keladi, generator esa bizga kerakli qiymatlar to'plamini bittadan olib keladi (tashiydi)

Tasavvur qiling siz qurilish qilyapsiz va devor uryapsiz, sizga 1000 ta g'isht kerak, ro'yxat shu g'ishlarni bittada olib keladi, generator esa bittadan olib keladi (albatta g'isht uyumi uncha uzoqda emas)

2. generator nimaga xotirani tejaydi?

keltirgan misolimizda sizni g'isht qo'yadigan joyingiz chekli sondagi g'isht qo'yishga moslashtirilgan, ya'ni xotira chekli

o'sha joyga ro'yxat bittada 1000 ta g'ishtni olib kirib qo'ydi va sizni g'isht qo'yadigan joyingizdan ko'proq joy egalladi, ya'niki xotiradan

generator esa sizga bitta g'isht olib keldi siz uni ishlatasiz keyin yana bitta g'isht olib keladi, g'isht qo'yadigan joydan juda kam joy oladi, ya'niki xotiradan

3. qachon ro'yxat ishlatish kerak, qachon generator? qaysi biri tez ishlaydi?

To'g'ri sizga mingta g'isht kerak bo'lsa ro'yxat xotiradan ozginagina ko'p joy olgani bilan, 1000 ta g'ishtni hammasi srazi yonida bo'lgan odam tezroq ishlaydi va bu holatda ro'yxat afzal,

Lekin tasavvur qiling sizga millionta g'isht kerak va ro'yxat uni sizga hammasini bittada olib kelib berdi, birinchidan u juda ko'p joy oladi (ya'niki xotiradan), ikkinchidan ishlashga xalaqit qiladi, bu holatda generator afzal va tezroq ishlaydi
👍3🔥1
Hamma postlarimga o'zim layk bosim chiqsammikin a, keyin ko'zim ko'rib quvonardim layk bosilibdi deb😁
👍5👏2
Layk bosgan yaxshi insonga raxmat🫡
👍41
Context Managers (Kontekst menejerlari)

Context Manager — bu with operatori orqali blok ichida resursni ochib-yopishni boshqaruvchi obyekt. Masalan, fayl ochish va avtomatik yopish.

Misol:

with open('file.txt', 'r') as f:
data = f.read()
# Fayl avtomatik yopiladi


O‘zimiz context manager yozish (klass bilan):

class MyContext:
def __enter__(self):
print("Kontekstga kirildi")
return self

def __exit__(self, exc_type, exc_val, exc_tb):
print("Kontekstdan chiqildi")

with MyContext():
print("Ichkarida ishlayapti")


Yoki funksiya bilan (contextlib):

from contextlib import contextmanager

@contextmanager
def my_context():
print("Boshlanmoqda")
yield
print("Tugallanmoqda")

with my_context():
print("Ichida ishlayapti")
Context Managers haqida batafsil yoritmoqchiman, qarshimasmisizlar?🧐
👍1
Context managerni tushunishdan oldin biz with operatorini tushunib olishimiz zarur bo'ladi.
🧠 with operatori nima?

with — bu Pythondagi maxsus operator bo'lib, u faqat context manager deb ataladigan obyektlar bilan ishlaydi.

Bu degani siz qayerdadir withni ishlatyapsizmi, demak siz o'zingiz bilib yoki bilmay context managerdan foydalanyapsiz! (manabunisi surpriz deganlar nechtamiz🤓)

🎯 withning asosiy maqsadi:
Resurs (masalan fayl, ulanish, lock, va h.k.) bilan ishlashni xavfsiz va toza qilish: ya’ni avtomatik ochish va tozalash/yopishni boshqarish.

Agar siz with ishlatmasangiz resurs bilanishlaganingizda, masalan fayl bilan ishlaganingizda birinchi uni ochasiz, nimadir ish bajarasiz va keyin uni yopasiz, ikkita amal orasida qandaydir xatolik chiqishi mumkinligini hisobga olib try - finally ishlatishingiz kerak, bo'lmasa qandaydir xatoliklar chiqishi mumkin. Shuningdek fayl ochib keyin yopish esingizdan chiqishi oqibatida xatoliklar chiqishi mumkin.

Shunaqa muammolar chiqmasligini xoxlasangiz bu ishlarni withga topshirasiz, va u bu ishlarni siz uchun o'zi amalga oshiradi.

🔁 Foydalanish sxemasi:

with <context_manager> as <variable>:
# shu yerda ish bajariladi

Eng keng tarqalgan misol:

with open("data.txt", "r") as f:
content = f.read()


with faqat context manager bilan ishlaydi. Ya’ni, with bilan ishlatilayotgan bu obyektlar:

1. __enter__() metodiga ega bo'lishi kerak (blok boshlanishida chaqiriladi)
2. __exit
__() metodiga ega bo'lishi kerak (blok tugaganda avtomatik chaqiriladi)
Bir kod tahlili:


with open("data.txt", "r") as f:
content = f.read()


🔍 Bu kodda nimalar sodir bo‘ladi?

with operatori — bu context managerni chaqiradi.

1️⃣ Qadam: open("data.txt", "r")
• open() funksiyasi faylni ochadi va TextIOWrapper nomli fayl obyektini qaytaradi.
• Bu obyekt __enter__ va __exit__ metodlariga ega — ya’ni context manager sifatida ishlay oladi.

2️⃣ Qadam: __enter__() chaqiriladi
• Python avtomatik f = open(...).enter() deb chaqiradi.
• Bu metod faylni ochib, uning obyektini f o‘zgaruvchisiga beradi.

3️⃣ Qadam: f.read()
• Fayldan butun mazmuni content o‘zgaruvchisiga o‘qiladi.

4️⃣ Qadam: __exit__() chaqiriladi
• with blokidan chiqishda (hatto xatolik bo‘lsa ham!), Python:


f.__exit__(exc_type, exc_val, exc_tb)

metodini chaqiradi.

Bu metod faylni avtomatik yopadi.

🟦 Ya'ni, yuqorida keltirgan kodimiz aslida quyidagiga teng:


f = open("data.txt", "r")
try:
content = f.read()
finally:
f.close()

Farqi shundaki, with versiyasi:

• Xatolarga nisbatan xavfsiz
• Toza, tushunarli, qisqa kod
• Har doim faylni yopishni kafolatlaydi
Bir kod tahlili:

Biz ishlatadigan kod:

with my_obj as var:
# blok

Bu kod python tomonidan quyidagi kodga aylantiriladi va bajariladi, lekin bizning ko'zimizga ko'rsatilmaydi:

var = my_obj.__enter__()
try:
# blok ← bu kod `__enter__` ichida EMAS
finally:
my_obj.__exit__(exc_type, exc_value, traceback)


Bosqichlar:

• __enter__() — resursni tayyorlash bosqichi
• # blok — asosiy ishlar bajariladi
• __exit
__() — resurs tozalash bosqichi


Xulosa qiladigan bo'lsak, har qanday obyekt Pythonda context manager bo‘la oladi, agar u quyidagi ikkita metodga ega bo‘lsa:

1. __enter__(self)
2. __exit__(self, exc_type, exc_value, traceback)

with operatorini qo'llaganimizda esa bu metodlarni avtomatik bajarib beradi.


Siz aytishingiz mumkin siz keltirgan postlarda, quyidagi context manager yaratish kodi bor, lekin unda __enter__ va __exit
__ metodlari yo'q deb:
from contextlib import contextmanager

@contextmanager
def my_context():
print("Boshlanmoqda")
yield
print("Tugallanmoqda")

with my_context():
print("Ichida ishlayapti")


🔍 @contextmanager dekoratori nima qiladi?
1. Siz generator funksiyasini (log_block) aniqlaysiz, unda:

• yielddan oldingi qism = __enter__ ishini bajaradi
• yielddan keyingi qism = __exit
__ ishini bajaradi

2. @contextmanager o‘zi bu generatorni enter va exit metodlari bor maxsus obyektga o‘rab beradi.

• chaqirilganda __enter__() — generatorni ishga tushiradi va yieldgacha boradi, qiymat (yoki None) qaytaradi
• blok tugagach __exit
__() — generatorga istalgan istisno ma’lumotlarini yuboradi va tozalash kodini (yielddan keyingilarni) ishga tushiradi
asyncio — Asinxron dasturlash

Tavsif:

• asyncio — bu asinxron I/O (input/output) asosida ishlaydigan kutubxona.
• async va await kalit so‘zlari orqali ishlaydi.
• Bir nechta vazifalarni (masalan, tarmoq so‘rovlari) bitta ip (thread) ichida navbatma-navbat boshqaradi.
• Tezkor, lekin CPU-intensiv vazifalar uchun emas, balki I/O-intensiv (masalan: fayl o‘qish, tarmoq, kutish) vazifalar uchun juda samarali.

Afzalliklari:

• Yengil resurs iste'moli.
• Ko‘p ulanishli web-serverlar yoki API mijozlari uchun ideal.

Misol:

import asyncio

async def salom_ber(name):
await asyncio.sleep(1)
print(f"Salom, {name}!")

async def main():
await asyncio.gather(
salom_ber("Ali"),
salom_ber("Vali"),
)

asyncio.run(main())