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
Zamykaniye (closure) — funksiyada holatni eslab qolish mexanizmi

Zamykaniye — bu ichki funksiya bo‘lib, u tashqi funksiyadagi o‘zgaruvchilarga ularning ko‘rinish doirasidan tashqarida bo‘lsa ham murojaat qila oladi.

🔑 Muhim jihati shundaki, zamykaniye qiymatlarni emas, balki o‘zgaruvchining o‘ziga bo‘lgan havolani (reference) eslab qoladi. Bu esa, ularni so‘nggi holati bilan ishlatishga imkon beradi.

📌 Zamykaniye qachon kerak bo‘ladi?
— Funktsiyada doimiy holatni saqlab turish kerak bo‘lsa.
Global o‘zgaruvchilarsiz kod yozmoqchi bo‘lsangiz.
— Yangi funksiya yaratish uchun funksiya ichida funksiyadan foydalanish zarur bo‘lsa.

🧠 Python’da zamykaniye oddiy ko‘rinishda ishlaydi:


def counter():
    son = 0
    def increment():
        nonlocal son
        son += 1
        return son
    return increment

hisobla = counter()
print(hisobla())  # 1
print(hisobla())  # 2


Bu yerda increment() funksiyasi son o‘zgaruvchisini eslab qolgan — mana bu zamykaniye!

💡 Kichik, ammo kuchli konsepsiya — kodingizni toza, moslashuvchan va kapsullangan qiladi.
Faqat nomlangan argumentlarni (kwargs) qabul qiluvchi funksiyalar haqida

Python’da **kwargs — bu funksiyaga istalgan miqdorda nomlangan argumentlarni uzatish usuli.

🔹 **kwargs funksiyada oxirgi parametr sifatida yoziladi.
🔹 Unga uzatilgan argumentlar kalit-qiymat (key-value) juftliklari shaklida dict (lug‘at) ga aylanadi.
🔹 Bu funksiyaga qo‘shimcha, dinamik parametrlar yuborish uchun juda qulay.

📌 Misol:


def salom_ber(**kwargs):
for kalit, qiymat in kwargs.items():
print(f"{kalit} = {qiymat}")

salom_ber(ism='Ali', yosh=25, til='Python')
# chiqadi: ism = Ali, yosh = 25, til = Python

🧠 Agar siz *args (pozitsion argumentlar) va **kwargs ni birga ishlatsangiz — *args doim birinchi bo‘lib ko‘rsatiladi:


def funk(a, *args, **kwargs):
pass

🎯 **kwargs — funksiyani moslashuvchan, kengaytiriladigan va universal qilish uchun qudratli vosita!


https://t.me/simplypythonuz
slots atributi — xotira tejamkor va qat’iy klasslar uchun vosita

Python’dagi slots — bu klass obyektlarida faqat oldindan belgilangan atributlarga ruxsat berish imkonini beruvchi maxsus atributdir.

🔐 Nega slots kerak?

Klass obyektlariga yangi atributlar yaratishga ruxsat bermaydi — faqat slots ro‘yxatida ko‘rsatilganlar bo‘ladi.
Har bir obyekt uchun alohida dict yaratilmaydi → bu esa xotiradan tejamkor foydalanish degani.
Katta miqdordagi oddiy obyektlar bilan ishlaganda samaradorlikni oshiradi.

📌 Misol:

class Foydalanuvchi:
__slots__ = ['ism', 'yosh']

def __init__(self, ism, yosh):
self.ism = ism
self.yosh = yosh

f = Foydalanuvchi('Ali', 25)
f.email = 'ali@gmail.com' # AttributeError: 'Foydalanuvchi' object has no attribute 'email'

⚠️ Eslatma:
slots meros bo‘lmaydi, har bir voris klassda alohida aniqlanishi kerak.
— Dinamik atribut qo‘shish kerak bo‘lgan holatlarda slots ishlatilmaydi.

🧠 Tavsiya qilinadi: slots ni oddiy, o‘zgarmas (immutable) klasslar va ko‘p obyekt yaratiladigan tizimlarda ishlating.


https://t.me/simplypythonuz
Python modullarni qanday qidiradi?

Python’da modul import qilinayotganda, interpreter ma’lum bir tartib bo‘yicha uni qidiradi:

🔍 Modulni qidirish algoritmi:

1️⃣ Avvalo ichki (built-in) modullar tekshiriladi — ya’ni Python’ning o‘zida mavjud bo‘lgan modullar (math, sys, time va h.k.).

2️⃣ So‘ngra sys.path ro‘yxatidagi kataloglar navbatma-navbat ko‘rib chiqiladi:
🔹 Joriy skript joylashgan papka
🔹 PYTHONPATH atrof-muhit o‘zgaruvchisi orqali berilgan kataloglar
🔹 Python'ning standart kutubxonalar kataloglari

3️⃣ Agar modul yuqoridagilarning hech birida topilmasa — ImportError istisnosi yuz beradi.


import sys
print(sys.path) # Python modul qidirayotgan yo‘llarni ko‘rsatadi

💡 sys.path’ga yangi yo‘l qo‘shib, siz qo‘shimcha kataloglardan modul import qilishingiz mumkin.


import sys
sys.path.append('/path/to/your/modules')


https://t.me/simplypythonuz
Sizning yopiq guruhingizdan kanalingizga aytilgan vaqtda avtomatik post tashlab turadigan bot kodi:

——->

yopiq kanal: https://t.me/+G8Ao2nlAzBQ0ZGIy
post link: https://t.me/c/2447128954/24

https://t.me/simplypythonuz
JSON modulida qo‘llab-quvvatlanmaydigan obyektlarni qanday seyrializatsiya qilish mumkin?

Agar siz JSON orqali seyrializatsiya qilmoqchi bo‘lgan obyekt standart json moduli tomonidan qo‘llab-quvvatlanmasa — bu muammoning bir nechta yechimlari mavjud:

🔧 Echimlar:

1️⃣ __getattr__ va __setattr__ metodlarini yozish
Obyektni dict shakliga o‘tkazish orqali JSON formatga oson o‘tkazish mumkin.

2️⃣ @dataclass dekoratori
dataclasses modulidagi @dataclass avtomatik ravishda obyektni JSON'ga tayyor holatga keltiradi.

3️⃣ json.JSONEncoder dan voris olish
Maxsus default() metodini yozish orqali murakkab obyektlarni o‘zingiz istagancha seyrializatsiya qilish mumkin.

4️⃣ marshmallow kutubxonasidan foydalanish
Kompleks obyektlar uchun seyrializatsiya/deseyrializatsiya sxemalarini yaratish imkonini beradi.

5️⃣ Qo‘lda dict yoki list ga aylantirish
Obyekt metodlari yoki reflection orqali JSON formatga mos shaklga keltirish.

6️⃣ Boshqa formatlarga o‘tish
Masalan: YAML, MessagePack yoki protobuf — ular ko‘proq ma’lumot turlarini qo‘llab-quvvatlaydi.

💡 Har doim obyektni JSON’ga o‘tkazishdan oldin: uni oddiy ma’lumot turiga aylantiring yoki mos keluvchi vositadan foydalaning.


# JSONEncoder misoli:
import json

class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, MyCustomClass):
return obj.to_dict()
return super().default(obj)
Seyrializatsiya (serializatsiya) nima?

Seyrializatsiya — bu obyektlarni baytlar oqimiga aylantirish jarayoni bo‘lib, ular faylga, ma’lumotlar bazasiga saqlanishi yoki tarmoq orqali uzatilishi mumkin.

🧠 Bu yordamida obyekt holatini saqlab qo‘yish va keyinroq tiklash mumkin bo‘ladi.

📌 Seyrializatsiyaning afzalliklari:
Dastur sessiyalari orasida obyekt holatini saqlash va tiklash.
Obyektlarni tarmoq orqali boshqa ilovalar yoki serverlarga uzatish.
Platformaga bog‘liq bo‘lmagan saqlash formatiga aylantirish imkoniyati (masalan: JSON, XML, pickle).

💡 Oddiy qilib aytganda, seyrializatsiya — bu ma’lumotlarni saqlash yoki yuborish uchun “yig‘ishtirib” olish jarayoni.


# Python'da misol (pickle yordamida):
import pickle

data = {'user': 'Ali', 'age': 25}
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
__all__ atributi nima uchun kerak?

Python dasturlashda __all__ — bu moduldan from modul import * yordamida nima eksport qilinishini boshqaruvchi maxsus atribut.

🔍 Asosiy ma'lumotlar:
all — bu eksport qilinadigan nomlar ro‘yxati bo‘lishi kerak.
Agar all aniqlanmagan bo‘lsa, import * barcha _ bilan boshlanmagan nomlarni import qiladi.
all yordamida modul muallifi faqat ommaviy API qismlarini eksport qilinishini nazorat qilishi mumkin.
Ichki funksiyalar, klasslar yoki o‘zgaruvchilar tasodifan eksport qilinmaydi — bu kodni toza va tartibli saqlashga yordam beradi.

💡 Qisqacha qilib aytganda, all — bu modulning ko‘rinishini boshqaruvchi oddiy, ammo foydali vosita.


# Misol:
__all__ = ['foydali_funktsiya', 'OmmaviyKlass']


📦 Foydalaning — kod yanada tushunarli va xavfsiz bo‘ladi!
#oddiy_tilda #class
Hamma class, class deyveradi class o'zi nima? Hech tushunolmayman🧐

class — bu obyektga yo‘naltirilgan dasturlash asosidagi shablon bo‘lib, u yordamida obyektlar (ya'ni real hayotdagi narsalarning dasturdagi modellari) yaratiladi.

Xop class obyektlar yaratish uchun shablon ekan, buni tushundim lekin nega men bu shablondan foydalanishim kerak, usiz kod yozolmaymanmi?

Albatta yozish mumkin, xuddiki bir kamaz tuproqni mashinada emas qo'lda tashiganday bo'lasiz xalos, tuproq oz bo'lsaku (kichik programmachalar) bilinmaydi, lekin juda ko'p bo'lsachi?

class — bu bir xil xususiyat va funksiyalarga ega obyektlar uchun shablon. E'tibor bering bir xil xususiyatga ega obyektlar uchun shablon.

Tasavvur qiling, siz ming xil odam qatnashgan o'yin yaratyapsiz. Endi har bir odam uchun noldan kod yozib chiqasizmi? Bitta odamni yasashga aytaylik 1 kun vaqtiz ketadi, shunda dasturni ming kunda bitirasizmi?

Shu joyda sizga class yordamga keladi, class so'zini tarjimasi sinf to'g'rimi? Siz to'g'ri tushundingiz biz o'yinda ishtirok etadigan obyektlarni sinflarga bo'lamiz, masalan mingta odamni bitta inson sinfiga tegishli deymiz. Ya'ni inson degan class yaratamiz va unga hamma insonlar uchun umumiy bo'lgan xususiyatlarni (boshi bor, ikkita qo'li, ikkita oyog'i bor, oyoqlari bilan yuradi va hokazo) shablon qilib kiritib qo'yamiz.

Nima deb o'ylaysiz endi ishimiz osonlashadimi? Albatta osonlashadi chunki biz bir marta shablon yozamiz va bu shablondan mingta odam obyektini yaratishda foydalanamiz bu orqali hammaga umumiy bo'lgan xususiyatlarni qayta yozib o'tirmay oldin yozilganidan foydalanamiz😀.

class larni yana ko'plab foydali imkoniyatlari bor va ular bilan keyingi postlarda tanishamiz.

Agar foydali bo'lgan bo'lsa reaksiya ❤️ qoldirishni unutmang.

Bu reaksiya bizga motivatsiya bo'ladi va tayyorlayotgan kontentimiz sifatining yanada oshishiga sabab bo'ladi
1👍1
Inheritance va polymorphismni oddiy qilib tushuntirib berishimni xohlaganlar bormi?
Anonymous Poll
63%
Ha
25%
Albatta😂
13%
Yo'q
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