threading — Ko‘p ipli (multi-threaded) dasturlash
Tavsif:
• Har bir vazifa alohida ip (thread) ichida ishlaydi.
• Python Global Interpreter Lock (GIL) sababli haqiqiy parallel CPU ishlashi cheklangan (bir vaqtning o‘zida faqat bitta ip interpreterni egallaydi).
• Biroq I/O-intensiv ishlar (masalan, web so‘rovlar) uchun foydali bo‘lishi mumkin.
Afzalliklari:
• Kodni yozish nisbatan oson.
• Kutishli vazifalarda samarali.
Kamchiliklari:
• GIL sababli CPU-intensiv ishlar samarali emas.
• thread larni boshqarish va sinxronlashda murakkabliklar (deadlock, race condition) bo'lishi mumkin.
Misol:
Tavsif:
• Har bir vazifa alohida ip (thread) ichida ishlaydi.
• Python Global Interpreter Lock (GIL) sababli haqiqiy parallel CPU ishlashi cheklangan (bir vaqtning o‘zida faqat bitta ip interpreterni egallaydi).
• Biroq I/O-intensiv ishlar (masalan, web so‘rovlar) uchun foydali bo‘lishi mumkin.
Afzalliklari:
• Kodni yozish nisbatan oson.
• Kutishli vazifalarda samarali.
Kamchiliklari:
• GIL sababli CPU-intensiv ishlar samarali emas.
• thread larni boshqarish va sinxronlashda murakkabliklar (deadlock, race condition) bo'lishi mumkin.
Misol:
import threading
import time
def salom_ber(name):
time.sleep(1)
print(f"Salom, {name}!")
t1 = threading.Thread(target=salom_ber, args=("Ali",))
t2 = threading.Thread(target=salom_ber, args=("Vali",))
t1.start()
t2.start()
t1.join()
t2.join()
multiprocessing — Ko‘p jarayonli (multi-process) dasturlash
Tavsif:
• Har bir vazifa yangi jarayon (process) sifatida ishga tushadi.
• Har bir jarayon o‘zining alohida Python interpreter va xotira maydoni bilan ishlaydi — bu GIL muammosini chetlab o‘tadi.
• CPU-intensiv (masalan: matematik hisob-kitoblar, katta ma'lumotlarni qayta ishlash) ishlar uchun ideal.
Afzalliklari:
• To‘liq parallel ishlash (ko‘p yadroli CPU dan to‘liq foydalanish mumkin).
• GIL muammosi yo‘q.
Kamchiliklari:
• Resurslar ko‘proq sarflanadi.
• Har bir jarayon alohida bo‘lgani uchun ma’lumot almashinuvi murakkab.
Misol:
Tavsif:
• Har bir vazifa yangi jarayon (process) sifatida ishga tushadi.
• Har bir jarayon o‘zining alohida Python interpreter va xotira maydoni bilan ishlaydi — bu GIL muammosini chetlab o‘tadi.
• CPU-intensiv (masalan: matematik hisob-kitoblar, katta ma'lumotlarni qayta ishlash) ishlar uchun ideal.
Afzalliklari:
• To‘liq parallel ishlash (ko‘p yadroli CPU dan to‘liq foydalanish mumkin).
• GIL muammosi yo‘q.
Kamchiliklari:
• Resurslar ko‘proq sarflanadi.
• Har bir jarayon alohida bo‘lgani uchun ma’lumot almashinuvi murakkab.
Misol:
from multiprocessing import Process
import time
def salom_ber(name):
time.sleep(1)
print(f"Salom, {name}!")
if __name__ == '__main__':
p1 = Process(target=salom_ber, args=("Ali",))
p2 = Process(target=salom_ber, args=("Vali",))
p1.start()
p2.start()
p1.join()
p2.join()
Yuqoridagilarga o'xshatish:
CPU yadrosi -> oshpaz
bitta ip (thread) -> ofitsiant
1. oddiy dasturlash:
• oshpaz bitta, ofitsiant bitta
• bitta ofitsiant bitta mizojga vaqt ajratadi va to u turib ketmaguncha boshqa mijozga qaramaydi
• lekin juda kam mijoz keladigan oshxonaga bo'laveradi
2. asyncio — Asinxron dasturlash:
• oshpaz bitta, ofitsiant bitta
• bitta ofitsiant biror mijozga xizmat ko'rsatayotgan vaqtda boshqa mijoz kelsa, birinchi mijozdan bo'sh vaqtida qolgan mijozlarga ham xizmat qilaveradi
• natijada ofitsiantdan unumli foydalanib ishlarni tezlashtiramiz
• ish maksimum oshpazni imkoniyati qadar tezlashadi, lekin oshpazga bog'liq bo'lmagan ishlar ancha tezlashadi
3. threading — Ko‘p ipli (multi-threaded) dasturlash
• oshpaz bitta, ofitsiant ko'p
• har bir ofitsiant bittada mijozga xizmat qiladi, natijada ish tezlashadi
• ish maksium oshpaz imkoniyati qadar oshadi, chunki asyncio kabi oshpaz bitta, va bir vaqtda oshpaz bitta ofitsiant bilan ishlay oladi xalos
• oshpazga bog'liq bo'lmagan ishlarda, asyncio tezroq ishlaydi, sabibi yangi ofitsiant yo'llashning o'ziga yarasha qo'shimcha ishlari bor va xarajati yuqori
• 64-bitlik pythonda 10 000 tagacha ofitsiant yo'llashingiz mumkin, kompyuter kuchidan kelib chiqib
4. multiprocessing — Ko‘p jarayonli (multi-process) dasturlash
• oshpaz ko'p, ofitsiant ko'p
• xuddiki bir nechta oshxonangiz bor va mijozlarni ularga taqsimlayapsiz, ular bir-biridan butkul mustaqil
• agar ishingiz asosan oshpazga bog'liq bo'lsa, bu qolgan turlardan ko'ra juda tez ishlaydi, lekin sizda oshpazga bog'liq bo'lmagan ishlar (masalan: idish yuvish) ko'p bo'lsa yangi oshxonalar ochishingizga arzimaydi. yangi oshxona ochish va hamma oshxonalardan habardor bo'lib turish ko'p energiya talab qiladi.
• yana shuni bilish kerakki, sizda 8 ta oshxona bo'lsa, siz maksimum bir vaqtda 8 ta oshpaz ishlatasiz, va qolgan oshpazlar oshxonalar uchun navbatda turadi
CPU yadrosi -> oshpaz
bitta ip (thread) -> ofitsiant
1. oddiy dasturlash:
• oshpaz bitta, ofitsiant bitta
• bitta ofitsiant bitta mizojga vaqt ajratadi va to u turib ketmaguncha boshqa mijozga qaramaydi
• lekin juda kam mijoz keladigan oshxonaga bo'laveradi
2. asyncio — Asinxron dasturlash:
• oshpaz bitta, ofitsiant bitta
• bitta ofitsiant biror mijozga xizmat ko'rsatayotgan vaqtda boshqa mijoz kelsa, birinchi mijozdan bo'sh vaqtida qolgan mijozlarga ham xizmat qilaveradi
• natijada ofitsiantdan unumli foydalanib ishlarni tezlashtiramiz
• ish maksimum oshpazni imkoniyati qadar tezlashadi, lekin oshpazga bog'liq bo'lmagan ishlar ancha tezlashadi
3. threading — Ko‘p ipli (multi-threaded) dasturlash
• oshpaz bitta, ofitsiant ko'p
• har bir ofitsiant bittada mijozga xizmat qiladi, natijada ish tezlashadi
• ish maksium oshpaz imkoniyati qadar oshadi, chunki asyncio kabi oshpaz bitta, va bir vaqtda oshpaz bitta ofitsiant bilan ishlay oladi xalos
• oshpazga bog'liq bo'lmagan ishlarda, asyncio tezroq ishlaydi, sabibi yangi ofitsiant yo'llashning o'ziga yarasha qo'shimcha ishlari bor va xarajati yuqori
• 64-bitlik pythonda 10 000 tagacha ofitsiant yo'llashingiz mumkin, kompyuter kuchidan kelib chiqib
4. multiprocessing — Ko‘p jarayonli (multi-process) dasturlash
• oshpaz ko'p, ofitsiant ko'p
• xuddiki bir nechta oshxonangiz bor va mijozlarni ularga taqsimlayapsiz, ular bir-biridan butkul mustaqil
• agar ishingiz asosan oshpazga bog'liq bo'lsa, bu qolgan turlardan ko'ra juda tez ishlaydi, lekin sizda oshpazga bog'liq bo'lmagan ishlar (masalan: idish yuvish) ko'p bo'lsa yangi oshxonalar ochishingizga arzimaydi. yangi oshxona ochish va hamma oshxonalardan habardor bo'lib turish ko'p energiya talab qiladi.
• yana shuni bilish kerakki, sizda 8 ta oshxona bo'lsa, siz maksimum bir vaqtda 8 ta oshpaz ishlatasiz, va qolgan oshpazlar oshxonalar uchun navbatda turadi
I/O ishlar uchun asyncio odatda threading dan tezroq va samaraliroq bo‘ladi.
🧪 Nima uchun asyncio tezroq?
1. Bitta ip (thread) — resurs tejamkor
• asyncio bitta ipda ishlaydi, ya’ni thread yaratish, boshqarish, kontekst o‘zgartirish (context switch) xarajatlari yo‘q.
• threading esa har bir ish uchun alohida ip ochadi — bu esa tizimda ortiqcha yuk keltiradi.
2. Kontekst almashtirish (context switching) kam
• asyncio vazifalarni event loop orqali navbatma-navbat bajaradi.
• threading esa OS yordamida iplar orasida doimiy kontekst o‘zgarishiga sabab bo‘ladi (sekinroq).
3. Ko‘p ulanishli serverlar uchun ideal
• Masalan, 10 000 HTTP so‘rovni qayta ishlash kerak bo‘lsa:
• asyncio buni bitta ipda qiladi.
• threading da bu 10 000 ip yaratish degani bo‘lishi mumkin — tizim yiqiladi.
📊 Tezlik solishtiruvi (oddiy misol bilan):
asyncio bilan:
threading bilan:
👉 Natijada:
• asyncio — ~1.1 sekund.
• threading — ~1.5-2.5 sekund (va ko‘proq xotira ishlatiladi).
🧪 Nima uchun asyncio tezroq?
1. Bitta ip (thread) — resurs tejamkor
• asyncio bitta ipda ishlaydi, ya’ni thread yaratish, boshqarish, kontekst o‘zgartirish (context switch) xarajatlari yo‘q.
• threading esa har bir ish uchun alohida ip ochadi — bu esa tizimda ortiqcha yuk keltiradi.
2. Kontekst almashtirish (context switching) kam
• asyncio vazifalarni event loop orqali navbatma-navbat bajaradi.
• threading esa OS yordamida iplar orasida doimiy kontekst o‘zgarishiga sabab bo‘ladi (sekinroq).
3. Ko‘p ulanishli serverlar uchun ideal
• Masalan, 10 000 HTTP so‘rovni qayta ishlash kerak bo‘lsa:
• asyncio buni bitta ipda qiladi.
• threading da bu 10 000 ip yaratish degani bo‘lishi mumkin — tizim yiqiladi.
📊 Tezlik solishtiruvi (oddiy misol bilan):
asyncio bilan:
import asyncio
import time
async def fake_io():
await asyncio.sleep(1)
async def main():
start = time.time()
await asyncio.gather(*[fake_io() for _ in range(100)])
print("Asyncio:", time.time() - start)
asyncio.run(main())
threading bilan:
import threading
import time
def fake_io():
time.sleep(1)
start = time.time()
threads = []
for _ in range(100):
t = threading.Thread(target=fake_io)
t.start()
threads.append(t)
for t in threads:
t.join()
print("Threading:", time.time() - start)
👉 Natijada:
• asyncio — ~1.1 sekund.
• threading — ~1.5-2.5 sekund (va ko‘proq xotira ishlatiladi).
Python dasturlash tilida o‘zgaruvchi (variable) nomlarini yozishda turli nomlash uslublari (naming conventions) mavjud, va ularning har biri ma'lum holatlarda ishlatiladi. Quyida wariable_name, variableName, va VariableName shakllarining qachon ishlatilishini tushunishga harakat qilamiz.
✅ 1. snake_case → variable_name
Eng keng tarqalgan Python uslubi.
🔹 Qayerda ishlatiladi:
• Oddiy o‘zgaruvchilar
• Funktsiyalar nomlari
• Modullar nomlari
📌 PEP8 — Python rasmiiy uslub qo‘llanmasi, snake_case ni tavsiya qiladi.
✅ 2. camelCase → variableName
Pythonda odatda ishlatilmaydi, lekin boshqa tillardan o‘rganilgan odat sifatida ko‘rinishi mumkin (masalan, JavaScript, Java).
🔹 Qayerda ishlatilishi mumkin:
• Boshqa tillardan kelgan API'larda (masalan, jsonData.userName)
• Django model metodlarida kamdan-kam
• Shaxsiy uslubda, lekin Python’da bu tavsiya qilinmaydi.
✅ 3. PascalCase → VariableName
Klass nomlari uchun ishlatiladi.
🔹 Qayerda ishlatiladi:
• Class nomlari
• Exception nomlari
✅ 4. UPPER_CASE → CONSTANT_NAME
Doimiy (o‘zgarmas) qiymatlar uchun ishlatiladi.
🧠 Xulosa (Qisqacha):
snake_case user_name O‘zgaruvchi, funksiya nomi
camelCase userName Pythonda tavsiya etilmaydi
PascalCase UserProfile Class nomlari
UPPER_CASE MAX_SIZE Konstantalar (o‘zgarmas qiymatlar)
✅ 1. snake_case → variable_name
Eng keng tarqalgan Python uslubi.
🔹 Qayerda ishlatiladi:
• Oddiy o‘zgaruvchilar
• Funktsiyalar nomlari
• Modullar nomlari
user_name = "Ali"
total_price = calculate_total()
📌 PEP8 — Python rasmiiy uslub qo‘llanmasi, snake_case ni tavsiya qiladi.
✅ 2. camelCase → variableName
Pythonda odatda ishlatilmaydi, lekin boshqa tillardan o‘rganilgan odat sifatida ko‘rinishi mumkin (masalan, JavaScript, Java).
🔹 Qayerda ishlatilishi mumkin:
• Boshqa tillardan kelgan API'larda (masalan, jsonData.userName)
• Django model metodlarida kamdan-kam
• Shaxsiy uslubda, lekin Python’da bu tavsiya qilinmaydi.
# Python uslubiga to‘g‘ri kelmaydi:
userName = "Ali"
✅ 3. PascalCase → VariableName
Klass nomlari uchun ishlatiladi.
🔹 Qayerda ishlatiladi:
• Class nomlari
• Exception nomlari
class UserProfile:
pass
class LoginError(Exception):
pass
✅ 4. UPPER_CASE → CONSTANT_NAME
Doimiy (o‘zgarmas) qiymatlar uchun ishlatiladi.
MAX_RETRIES = 5
DEFAULT_TIMEOUT = 10
🧠 Xulosa (Qisqacha):
Uslub Misol Qayerda ishlatiladisnake_case user_name O‘zgaruvchi, funksiya nomi
camelCase userName Pythonda tavsiya etilmaydi
PascalCase UserProfile Class nomlari
UPPER_CASE MAX_SIZE Konstantalar (o‘zgarmas qiymatlar)
❤1
camelCase Python'da tavsiya qilinmaydi, chunki bu Python’ning rasmiy kod yozish standarti — PEP8 ga zid keladi.
🔍 Sabablari:
1. PEP8 standarti snake_case ni belgilagan
Pythonning rasmiy ko‘rsatmasida funksiya va o‘zgaruvchi nomlari uchun faqat snake_case ishlatish belgilangan:
PEP8 — bu jamoaviy kodlashda konsistentlik (birxillik) yaratish uchun yaratilgan. Barcha Python kutubxonalari (masalan, Django, Flask, Pandas, NumPy) ham snake_case ishlatadi.
2. O‘qish osonligi
snake_case so‘zlar orasini aniq ajratadi:
3. Boshqa Python kodlari bilan uyg‘unlik
Pythonning standart kutubxonasi (masalan, os.path, json, datetime) hamma joyda snake_case ishlatadi. Agar siz camelCase ishlatsangiz, boshqa kodlar bilan uyg‘unlik buziladi.
4. Yangi Pythonchilar chalkashadi
Yangi o‘rganuvchilar JavaScript yoki Java’dan kelgan bo‘lsa, ular camelCase ishlatishga odatlangan bo‘ladi. Ammo bu Python'da noaniqlik keltiradi va yomon tajriba hisoblanadi.
💡 Qachon camelCase ishlatilsa bo‘ladi?
• Boshqa tillardan yoki tashqi APIlardan (JavaScript, Java, C#) kelayotgan kod bilan ishlaganda:
• C++/Java integratsiyasi qilinayotgan hollarda (masalan, PyQt, Qt metodlari):
✅ Xulosa:
Usul Python’da tavsiya etiladimi? Sababi
snake_case ✅ Ha PEP8 standarti, o‘qish oson
camelCase ❌ Yo'q Standartga zid, chalkashlik
🔍 Sabablari:
1. PEP8 standarti snake_case ni belgilagan
Pythonning rasmiy ko‘rsatmasida funksiya va o‘zgaruvchi nomlari uchun faqat snake_case ishlatish belgilangan:
# To'g'ri (PEP8):
user_name = "Ali"
def calculate_total():
...
# Noto'g'ri (camelCase):
userName = "Ali"
def calculateTotal():
...
PEP8 — bu jamoaviy kodlashda konsistentlik (birxillik) yaratish uchun yaratilgan. Barcha Python kutubxonalari (masalan, Django, Flask, Pandas, NumPy) ham snake_case ishlatadi.
2. O‘qish osonligi
snake_case so‘zlar orasini aniq ajratadi:
calculate_total_price # Aniq, tez o'qiladi
calculateTotalPrice # Ko'z uchun biroz yukliroq
3. Boshqa Python kodlari bilan uyg‘unlik
Pythonning standart kutubxonasi (masalan, os.path, json, datetime) hamma joyda snake_case ishlatadi. Agar siz camelCase ishlatsangiz, boshqa kodlar bilan uyg‘unlik buziladi.
4. Yangi Pythonchilar chalkashadi
Yangi o‘rganuvchilar JavaScript yoki Java’dan kelgan bo‘lsa, ular camelCase ishlatishga odatlangan bo‘ladi. Ammo bu Python'da noaniqlik keltiradi va yomon tajriba hisoblanadi.
💡 Qachon camelCase ishlatilsa bo‘ladi?
• Boshqa tillardan yoki tashqi APIlardan (JavaScript, Java, C#) kelayotgan kod bilan ishlaganda:
# JavaScript'dan kelgan JSON
json_data = {"userName": "Ali"}
user_name = json_data["userName"]
• C++/Java integratsiyasi qilinayotgan hollarda (masalan, PyQt, Qt metodlari):
self.setWindowTitle("App") # Qt: camelCase metod nomlari
✅ Xulosa:
Usul Python’da tavsiya etiladimi? Sababi
snake_case ✅ Ha PEP8 standarti, o‘qish oson
camelCase ❌ Yo'q Standartga zid, chalkashlik
💘1
🧠 Qaysi dasturlash tilini qachon ishlatish kerak?
🔧 C ➝ Operatsion tizimlar, o‘rnatilgan tizimlar, o‘yin dvijoklari
⚙️ C++ ➝ O‘yin ishlab chiqish, yuqori samarali dasturlar, moliya
📱 Java ➝ Katta korxona ilovalari, Android, backend serverlar
🖥 C# ➝ Unity o‘yinlari, Windows ilovalari
🐍 Python ➝ Sun’iy intellekt, ma’lumotlar, avtomatlashtirish, web
🌐 JavaScript ➝ Frontend, Full-stack, brauzer o‘yinlari
☁️ Golang ➝ Cloud xizmatlar, API, tarmoq
🍎 Swift ➝ iOS/macOS ilovalari
📱 Kotlin ➝ Android, backend
🌍 PHP ➝ Web dasturlash (WordPress, Laravel)
💎 Ruby ➝ Web (Rails), prototiplar
🦀 Rust ➝ Tizim ilovalari, blockchain, yuqori samarali kompyuterlar
🎮 Lua ➝ O‘yin skriptlash (Roblox, WoW)
📊 R ➝ Statistika, data science, bioinformatika
🗃 SQL ➝ Ma’lumot tahlili, ma’lumotlar bazasi boshqaruvi
🧩 TypeScript ➝ Kengaytiriladigan web ilovalar
⚡️ Node.js ➝ Backend, real-time ilovalar
🧑🎨 React ➝ Zamonaviy web interfeyslar
🌱 Vue ➝ Yengil SPA (Single Page App) lar
🧠 Django ➝ AI/ML backend, web development
🛠 Laravel ➝ To‘liq PHP stack
🌐 Blazor ➝ .NET bilan web
🏢 Spring Boot ➝ Mikroservislar, Java enterprise
🚀 Ruby on Rails ➝ MVP, startaplar
🎨 HTML/CSS ➝ UI/UX dizayn, web dizayn
🔁 Git ➝ Versiya nazorati
🐧 Linux ➝ Server, xavfsizlik, DevOps
⚙️ DevOps ➝ Infratuzilma avtomatlashtirish, CI/CD
🧪 CI/CD ➝ Testlash + deploy
📦 Docker ➝ Konteynerlashtirish
☸️ Kubernetes ➝ Cloud orchestration
🧩 Microservices ➝ Kattalasuvchan backendlar
🧪 Selenium ➝ Web testlash
🎭 Playwright ➝ Zamonaviy web avtomatlashtirish
❤️ Reaksiya qoldiring, kanalni kuzatishda davom eting — foydali kontentlar uchun 🚀
🔧 C ➝ Operatsion tizimlar, o‘rnatilgan tizimlar, o‘yin dvijoklari
⚙️ C++ ➝ O‘yin ishlab chiqish, yuqori samarali dasturlar, moliya
📱 Java ➝ Katta korxona ilovalari, Android, backend serverlar
🖥 C# ➝ Unity o‘yinlari, Windows ilovalari
🐍 Python ➝ Sun’iy intellekt, ma’lumotlar, avtomatlashtirish, web
🌐 JavaScript ➝ Frontend, Full-stack, brauzer o‘yinlari
☁️ Golang ➝ Cloud xizmatlar, API, tarmoq
🍎 Swift ➝ iOS/macOS ilovalari
📱 Kotlin ➝ Android, backend
🌍 PHP ➝ Web dasturlash (WordPress, Laravel)
💎 Ruby ➝ Web (Rails), prototiplar
🦀 Rust ➝ Tizim ilovalari, blockchain, yuqori samarali kompyuterlar
🎮 Lua ➝ O‘yin skriptlash (Roblox, WoW)
📊 R ➝ Statistika, data science, bioinformatika
🗃 SQL ➝ Ma’lumot tahlili, ma’lumotlar bazasi boshqaruvi
🧩 TypeScript ➝ Kengaytiriladigan web ilovalar
⚡️ Node.js ➝ Backend, real-time ilovalar
🧑🎨 React ➝ Zamonaviy web interfeyslar
🌱 Vue ➝ Yengil SPA (Single Page App) lar
🧠 Django ➝ AI/ML backend, web development
🛠 Laravel ➝ To‘liq PHP stack
🌐 Blazor ➝ .NET bilan web
🏢 Spring Boot ➝ Mikroservislar, Java enterprise
🚀 Ruby on Rails ➝ MVP, startaplar
🎨 HTML/CSS ➝ UI/UX dizayn, web dizayn
🔁 Git ➝ Versiya nazorati
🐧 Linux ➝ Server, xavfsizlik, DevOps
⚙️ DevOps ➝ Infratuzilma avtomatlashtirish, CI/CD
🧪 CI/CD ➝ Testlash + deploy
📦 Docker ➝ Konteynerlashtirish
☸️ Kubernetes ➝ Cloud orchestration
🧩 Microservices ➝ Kattalasuvchan backendlar
🧪 Selenium ➝ Web testlash
🎭 Playwright ➝ Zamonaviy web avtomatlashtirish
❤️ Reaksiya qoldiring, kanalni kuzatishda davom eting — foydali kontentlar uchun 🚀
👍2🔥2
🧠DRY (Don't Repeat Yourself)
DRY — bu “Don't Repeat Yourself” degan iboraning qisqartmasi bo‘lib, dasturlashdagi asosiy tamoyillardan biri hisoblanadi.
🧩 DRY NIMA UCHUN MUHIM?
🎯 Maqsad: Takrorlanuvchi kodlardan qochish va uni modullashtirish orqali dastur tuzilmasini soddalashtirish.
✅ Kodni tushunishni osonlashtiradi
✅ Xatoliklar ehtimolini kamaytiradi
✅ O‘zgarishlar kiritishni soddalashtiradi
✅ Qayta ishlatish imkonini beradi
❌ ANTI-DRY MISOL
🔁 Bu yerda bir xil funksiya 3 marta takrorlangan. Har safar til o‘zgarsa, kod o‘zgarishi kerak.
✅ DRY printsipi bilan to‘g‘rilangan variant:
Endi kodni 1 marta yozamiz, istalgan tilni faqat messages dictionarysidan qo‘shish kifoya.
💡 QACHON DRY PRINSIPIDAN FOYDALANISH KERAK?
• Bir xil struktura/kodni 2+ marta ko‘rsangiz
• Validatsiya, UI, sozlamalar, funksiya va klasslar takrorlansa
• copy-paste qilishni istagan bo‘lsangiz, DRY ni eslang 😉
🔧 DRY AMALIY MISOL: FORM VALIDATOR
❌ Yomon usul:
✅ DRY usul:
Endi validators["phone"](value) deb chaqirishingiz mumkin.
🧠 XULOSA: DRY printsipi orqali siz kodni emas, mantiqni yozasiz.
Bu nafaqat kod sifati, balki time-saving jihatdan ham eng foydali yondashuvlardan biridir.
DRY — bu “Don't Repeat Yourself” degan iboraning qisqartmasi bo‘lib, dasturlashdagi asosiy tamoyillardan biri hisoblanadi.
🧩 DRY NIMA UCHUN MUHIM?
🎯 Maqsad: Takrorlanuvchi kodlardan qochish va uni modullashtirish orqali dastur tuzilmasini soddalashtirish.
✅ Kodni tushunishni osonlashtiradi
✅ Xatoliklar ehtimolini kamaytiradi
✅ O‘zgarishlar kiritishni soddalashtiradi
✅ Qayta ishlatish imkonini beradi
❌ ANTI-DRY MISOL
def welcome_user_uz():
print("Assalomu alaykum!")
def welcome_user_ru():
print("Здравствуйте!")
def welcome_user_en():
print("Hello!")
🔁 Bu yerda bir xil funksiya 3 marta takrorlangan. Har safar til o‘zgarsa, kod o‘zgarishi kerak.
✅ DRY printsipi bilan to‘g‘rilangan variant:
def welcome_user(language):
messages = {
'uz': "Assalomu alaykum!",
'ru': "Здравствуйте!",
'en': "Hello!",
}
print(messages.get(language, "Assalomu alaykum!"))
Endi kodni 1 marta yozamiz, istalgan tilni faqat messages dictionarysidan qo‘shish kifoya.
💡 QACHON DRY PRINSIPIDAN FOYDALANISH KERAK?
• Bir xil struktura/kodni 2+ marta ko‘rsangiz
• Validatsiya, UI, sozlamalar, funksiya va klasslar takrorlansa
• copy-paste qilishni istagan bo‘lsangiz, DRY ni eslang 😉
🔧 DRY AMALIY MISOL: FORM VALIDATOR
❌ Yomon usul:
if not re.match(r"^\+998\d{9}$", phone):
print("Noto'g'ri telefon raqam!")
if not "@" in email:
print("Email noto‘g‘ri!")
✅ DRY usul:
validators = {
"phone": lambda v: re.match(r"^\+998\d{9}$", v),
"email": lambda v: "@" in v
}
Endi validators["phone"](value) deb chaqirishingiz mumkin.
🧠 XULOSA: DRY printsipi orqali siz kodni emas, mantiqni yozasiz.
Bu nafaqat kod sifati, balki time-saving jihatdan ham eng foydali yondashuvlardan biridir.
🧠 KISS – Keep It Simple, Stupid
🔤 O‘zbekchasi:
“Soddaroq yoz, axmoq!” yoki “Soddalik — kalitdir!”
📌 Asosiy g‘oya:
Tizim, kod, yoki yechim imkon qadar sodda va tushunarli bo‘lishi kerak.
KISS prinsipiga ko‘ra, agar bir narsani soddaroq yo‘l bilan qilsa bo‘lsa — demak, o‘sha yo‘l tanlanishi kerak.
📎 Tarixi:
KISS atamasi 1960-yillarda Kelly Johnson (Lockheed kompaniyasida ishlagan injener) tomonidan harbiy aviatsiyada ilgari surilgan.
Harbiy mexaniklar samolyotni maydonda oddiy asboblar bilan ta’mirlashi kerak. Agar dizayn murakkab bo‘lsa — bu imkonsiz.
🧩 Dasturlashda qanday ko‘rinadi?
❌ Yomon misol (murakkab):
✅ Yaxshi (KISS prinsipiga mos):
✨ KISS qoidalari amaliyotda:
1. ❌ Keraksiz abstraksiyalar yaratmang (Har bir class/funksiya haqiqiy zarurat bilan yaralsin)
2. ❌ “Nazarimda kelajakda kerak bo‘ladi” demang (Avval hozirgi ehtiyojni bajaring, keyin refactor qilasiz)
3. ✅ Funksiyalarni kichik va aniq tuting (Har bir funksiya bitta ish qilsin (Single Responsibility))
4. ✅ Qisqa, o‘qiladigan, tushunarli kod yozing (Boshqa dasturchi kodingizni o‘qiy olsin)
📍 Qachon KISS buziladi?
• “Katta tizim bo‘ladi” deb oldindan juda murakkab arxitektura o‘ylab topilganda
• Har bir kichik ish uchun alohida klass/fayl ochilganda
• Keraksiz design patternlar noto‘g‘ri ishlatilganda
✅ Xulosa:
🔹 Sodda kod — ishonchli, test qilinadigan, o‘zgartiriladigan kod.
🔹 Har doim “Soddaroq yo‘li bormi?” deb o‘zingizga savol bering.
🔹 Murakkablik zarurat bo‘lsa — bosqichma-bosqich qo‘shiladi.
🔤 O‘zbekchasi:
“Soddaroq yoz, axmoq!” yoki “Soddalik — kalitdir!”
📌 Asosiy g‘oya:
Tizim, kod, yoki yechim imkon qadar sodda va tushunarli bo‘lishi kerak.
KISS prinsipiga ko‘ra, agar bir narsani soddaroq yo‘l bilan qilsa bo‘lsa — demak, o‘sha yo‘l tanlanishi kerak.
📎 Tarixi:
KISS atamasi 1960-yillarda Kelly Johnson (Lockheed kompaniyasida ishlagan injener) tomonidan harbiy aviatsiyada ilgari surilgan.
Harbiy mexaniklar samolyotni maydonda oddiy asboblar bilan ta’mirlashi kerak. Agar dizayn murakkab bo‘lsa — bu imkonsiz.
🧩 Dasturlashda qanday ko‘rinadi?
❌ Yomon misol (murakkab):
def is_even(n):
return True if n % 2 == 0 else False
✅ Yaxshi (KISS prinsipiga mos):
def is_even(n):
return n % 2 == 0
✨ KISS qoidalari amaliyotda:
1. ❌ Keraksiz abstraksiyalar yaratmang (Har bir class/funksiya haqiqiy zarurat bilan yaralsin)
2. ❌ “Nazarimda kelajakda kerak bo‘ladi” demang (Avval hozirgi ehtiyojni bajaring, keyin refactor qilasiz)
3. ✅ Funksiyalarni kichik va aniq tuting (Har bir funksiya bitta ish qilsin (Single Responsibility))
4. ✅ Qisqa, o‘qiladigan, tushunarli kod yozing (Boshqa dasturchi kodingizni o‘qiy olsin)
📍 Qachon KISS buziladi?
• “Katta tizim bo‘ladi” deb oldindan juda murakkab arxitektura o‘ylab topilganda
• Har bir kichik ish uchun alohida klass/fayl ochilganda
• Keraksiz design patternlar noto‘g‘ri ishlatilganda
✅ Xulosa:
🔹 Sodda kod — ishonchli, test qilinadigan, o‘zgartiriladigan kod.
🔹 Har doim “Soddaroq yo‘li bormi?” deb o‘zingizga savol bering.
🔹 Murakkablik zarurat bo‘lsa — bosqichma-bosqich qo‘shiladi.
👍1
🧠 Funksiya Ichida Funksiya — DRY va Dinamik Validatsiyalar uchun Yondashuv
Ko‘pincha kodimizda turli status, role, type kabi qiymatlarni tekshirish kerak bo‘ladi. Har birini alohida validator qilib yozish esa kodni takrorlaydi (DRY prinsipiga zid).
🎯 Yechim: funksiya ichida funksiya yaratish (higher-order function). Ya'ni, dinamik validator generatori.
🔧 Misol: Mapping validatori generatori
Bu funksiya sizga har qanday mapping uchun validator yasab beradi. Qanday ishlaydi?
⚙️ Ishlash mexanizmi
Quyidagicha chaqirasiz:
Bosqichma-bosqich:
1. check_mapping(users_status, "Status") → sizga validator funksiyasini qaytaradi, va u validator funksiyasi users_status, "Status larga ham ega.
2. (cls, v) → bu validator funksiyasiga beriladi.
Ya'ni, check_mapping(...) → funksiya qaytaradi, bu funksiyani siz keyin chaqirasiz. Oddiyroq aytganda:
🧪 Pydanticda ishlatish
Yoki qisqaroq:
✅ Foyda nima?
🔁 Takrorlanadigan kodlar yo‘q
🧱 DRY prinsipiga mos
🧩 Dinamik validator yaratish mumkin
🧼 Kodingiz ancha toza va kengayuvchan bo‘ladi
user_role, user_status kabilar statik o'zgaruvchi bo'lsa ideal tanlov
Ko‘pincha kodimizda turli status, role, type kabi qiymatlarni tekshirish kerak bo‘ladi. Har birini alohida validator qilib yozish esa kodni takrorlaydi (DRY prinsipiga zid).
🎯 Yechim: funksiya ichida funksiya yaratish (higher-order function). Ya'ni, dinamik validator generatori.
🔧 Misol: Mapping validatori generatori
def check_mapping(mapping: dict, field_name: str):
def validator(cls, v):
if v not in mapping:
raise ValueError(f"{field_name} '{v}' noto‘g‘ri.")
return v
return validator
Bu funksiya sizga har qanday mapping uchun validator yasab beradi. Qanday ishlaydi?
⚙️ Ishlash mexanizmi
Quyidagicha chaqirasiz:
check_mapping(users_status, "Status")(cls, v)
Bosqichma-bosqich:
1. check_mapping(users_status, "Status") → sizga validator funksiyasini qaytaradi, va u validator funksiyasi users_status, "Status larga ham ega.
2. (cls, v) → bu validator funksiyasiga beriladi.
Ya'ni, check_mapping(...) → funksiya qaytaradi, bu funksiyani siz keyin chaqirasiz. Oddiyroq aytganda:
status_validator = check_mapping(users_status, "Status")
status_validator(cls, v)
🧪 Pydanticda ishlatish
@field_validator("status_id")
def validate_status(cls, v):
return check_mapping(users_status, "Status")(cls, v)
Yoki qisqaroq:
validate_status = field_validator("status_id")(
lambda cls, v: check_mapping(users_status, "Status")(cls, v)
)
✅ Foyda nima?
🔁 Takrorlanadigan kodlar yo‘q
🧱 DRY prinsipiga mos
🧩 Dinamik validator yaratish mumkin
🧼 Kodingiz ancha toza va kengayuvchan bo‘ladi
user_role, user_status kabilar statik o'zgaruvchi bo'lsa ideal tanlov
🔍 _value, __value, __value__ – farqlari nimada?
Ko‘p ko‘rasiz, lekin chalkashasizmi? Keling, tushunarli qilib ajratamiz 👇
1️⃣ _value — bitta pastki chiziq
👉 Ichki foydalanish uchun degan ishora.
🚫 Ammo hech qanday taqiqlov yo‘q.
📌 from module import * qilganda import qilinmaydi.
2️⃣ __value — ikkita pastki chiziq
👉 Bu nomlar klass ichida yashirinadi.
🔐 Python bu nomni avtomatik tarzda _<ClassName>__value ga o‘zgartiradi (name mangling).
📌 Bu encapsulation (ma’lumotni yashirish) uchun ishlatiladi.
3️⃣ __value__ — ikkala tomonda chiziq
👉 Bu Python’ning maxsus metodlari va atributlari.
🧠 Masalan: __init__, __str__, __len__, __dict__ va hokazo.
📌 Bunday nomlardan o‘zingiz foydalanmang, ular Pythonga tegishli!
Ko‘p ko‘rasiz, lekin chalkashasizmi? Keling, tushunarli qilib ajratamiz 👇
1️⃣ _value — bitta pastki chiziq
👉 Ichki foydalanish uchun degan ishora.
🚫 Ammo hech qanday taqiqlov yo‘q.
_value = 42 # "Bu ichki o‘zgaruvchi" degan signal
📌 from module import * qilganda import qilinmaydi.
2️⃣ __value — ikkita pastki chiziq
👉 Bu nomlar klass ichida yashirinadi.
🔐 Python bu nomni avtomatik tarzda _<ClassName>__value ga o‘zgartiradi (name mangling).
class MyClass:
def __init(self):
self.__secret = "sir"
obj = MyClass()
print(obj.__secret) #❌ AttributeError
print(obj._MyClass__secret) # ✅
📌 Bu encapsulation (ma’lumotni yashirish) uchun ishlatiladi.
3️⃣ __value__ — ikkala tomonda chiziq
👉 Bu Python’ning maxsus metodlari va atributlari.
🧠 Masalan: __init__, __str__, __len__, __dict__ va hokazo.
print(len("salom")) # Aslida bu str.__len__() chaqiradi
📌 Bunday nomlardan o‘zingiz foydalanmang, ular Pythonga tegishli!
🧠 __slots__ — Python klasslarida xotira va atributlarni boshqarish quroli
✳️ __slots__ nima?
Pythonda klassga istalgancha atribut qo‘shish mumkin — bu qulay, lekin xotiradan ko‘p foydalanadi.
Yuqoridagi kod har bir obyekt uchun Python __dict__ deb ataladigan lug‘at (dictionary) yaratadi. Bu lug‘at obyektning atributlarini saqlaydi. Har bir atribut — kalit/qiymat jufti sifatida joylashadi. Bu esa:
• ❌ Ko‘p xotira egallaydi
• ❌ Yangi atributlar istalgan paytda qo‘shilishi mumkin — bu xavfsizlikni kamaytiradi
✅ __slots__ bilan yechim:
Agar siz klassda faqat aniq belgilangan atributlargina bo‘lishini istasangiz va xotirani tejash ni xohlasangiz, __slots__ dan foydalaning:
🔒 Natija:
• Faqat name va age mavjud bo‘ladi
• Boshqa atribut qo‘shilsa, AttributeError chiqadi
• __dict__ yaratilmaydi ⇒ kamroq xotira ishlatiladi
📊 Taqqoslash:
Siz aytishingiz mumkin slots ham joy egallaydiku deb, sys.getsizeof(b.dict) desak bu attributlar ro'yxatining hajmini qaytaradi shunga bu ifoda chiqargan qiymat slots egallagan joy emas.
📌 slots bu sinf (class) darajasidagi statik belgidir, har bir obyekt uchun xotirada saqlanmaydi.
⚠️ Cheklovlar:
1. __slots__ bilan obyektga istalgancha atribut qo‘shib bo‘lmaydi:
2. __slots__ faqat klass darajasida ishlaydi. Meros bo‘lsa, ehtiyot bo‘ling:
3. Agar __slots__ ichida __dict__ yoki __weakref__ ni qo‘shsangiz, u holda istisnoga ruxsat:
🧩 Qachon ishlatish kerak?
1. Ko‘p obyekt yaratilsa (✅ Ha)
2. RAM cheklangan muhitlarda (✅ Ha)
3. Dinamik atributlar kerak bo‘lsa (❌ Yo‘q)
4. Debug qilishda qulaylik kerak (❌ Yo‘q)
🔚 Xulosa
• __slots__ yordamida klassdagi atributlar oldindan cheklanadi
• Bu esa xotirani tejash va atributlar ustidan nazorat beradi
• Lekin __slots__ — hamma holatga mos emas, shuning uchun aniq zarurat bo‘lsa qo‘llang
✳️ __slots__ nima?
Pythonda klassga istalgancha atribut qo‘shish mumkin — bu qulay, lekin xotiradan ko‘p foydalanadi.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
Yuqoridagi kod har bir obyekt uchun Python __dict__ deb ataladigan lug‘at (dictionary) yaratadi. Bu lug‘at obyektning atributlarini saqlaydi. Har bir atribut — kalit/qiymat jufti sifatida joylashadi. Bu esa:
• ❌ Ko‘p xotira egallaydi
• ❌ Yangi atributlar istalgan paytda qo‘shilishi mumkin — bu xavfsizlikni kamaytiradi
✅ __slots__ bilan yechim:
Agar siz klassda faqat aniq belgilangan atributlargina bo‘lishini istasangiz va xotirani tejash ni xohlasangiz, __slots__ dan foydalaning:
class Person:
__slots__ = ['name', 'age'] # faqat shu atributlarga ruxsat
def __init__(self, name, age):
self.name = name
self.age = age
🔒 Natija:
• Faqat name va age mavjud bo‘ladi
• Boshqa atribut qo‘shilsa, AttributeError chiqadi
• __dict__ yaratilmaydi ⇒ kamroq xotira ishlatiladi
📊 Taqqoslash:
import sys
class A:
def __init__(self):
self.x = 1
self.y = 2
class B:
__slots__ = ['x', 'y']
def __init__(self):
self.x = 1
self.y = 2
a = A()
b = B()
print("a:", sys.getsizeof(a) + sys.getsizeof(a.__dict__)) # umumiy hajm
print("b:", sys.getsizeof(b)) # faqat o'zining hajmi chunki b __dict__ ga ega emas
Siz aytishingiz mumkin slots ham joy egallaydiku deb, sys.getsizeof(b.dict) desak bu attributlar ro'yxatining hajmini qaytaradi shunga bu ifoda chiqargan qiymat slots egallagan joy emas.
📌 slots bu sinf (class) darajasidagi statik belgidir, har bir obyekt uchun xotirada saqlanmaydi.
⚠️ Cheklovlar:
1. __slots__ bilan obyektga istalgancha atribut qo‘shib bo‘lmaydi:
p = Person("Ali", 25)
p.email = "ali@example.com" # ❌ AttributeError
2. __slots__ faqat klass darajasida ishlaydi. Meros bo‘lsa, ehtiyot bo‘ling:
class A:
__slots__ = ['x']
class B(A):
pass # B uchun __dict__ mavjud bo'ladi (slots yo'q)
3. Agar __slots__ ichida __dict__ yoki __weakref__ ni qo‘shsangiz, u holda istisnoga ruxsat:
__slots__ = ['x', '__dict__']
🧩 Qachon ishlatish kerak?
1. Ko‘p obyekt yaratilsa (✅ Ha)
2. RAM cheklangan muhitlarda (✅ Ha)
3. Dinamik atributlar kerak bo‘lsa (❌ Yo‘q)
4. Debug qilishda qulaylik kerak (❌ Yo‘q)
🔚 Xulosa
• __slots__ yordamida klassdagi atributlar oldindan cheklanadi
• Bu esa xotirani tejash va atributlar ustidan nazorat beradi
• Lekin __slots__ — hamma holatga mos emas, shuning uchun aniq zarurat bo‘lsa qo‘llang
Sizga postlarning qanday formatda bo'lishi yoqadi
Anonymous Poll
44%
Qisqa, lo‘nda postlar (tez o‘qiladigan, konspekt)
33%
Batafsil tushuntiruvchi postlar (asosli tushuncha va kod)
22%
Ikkalasi aralash bo‘lsa yaxshi
0%
Menga farqi yo‘q, foydali bo‘lsa bo‘ldi
👍1
🔐 Maxfiy maʼlumotni .env da saqlayapsizmi? To‘xtang. Bu xavfli.
Pythonda token, parol, API kalitlarini xavfsiz saqlashning to‘g‘ri yo‘li — keyring kutubxonasi.
🛡 U nima qiladi?
• Parollarni tizim keychain ida saqlaydi
• Himoyalangan tarzda o‘qiydi va o‘chiradi
• Kodda parol qoldirishga ehtiyoj qolmaydi
💡 keyring — bu .env emas. Bu real xavfsizlik.
👉 Batafsil: kommentda tushuntiraman 👇
Pythonda token, parol, API kalitlarini xavfsiz saqlashning to‘g‘ri yo‘li — keyring kutubxonasi.
🛡 U nima qiladi?
• Parollarni tizim keychain ida saqlaydi
• Himoyalangan tarzda o‘qiydi va o‘chiradi
• Kodda parol qoldirishga ehtiyoj qolmaydi
💡 keyring — bu .env emas. Bu real xavfsizlik.
👉 Batafsil: kommentda tushuntiraman 👇
Yuqoridagi kabi kanalni o'zida qisqa post, komentariyasida batafsil post bo'lsa hammaga maqulmi
Anonymous Poll
86%
Ha shu yaxshi
14%
Bu unchalik maqul yo'l emas
#lambda
⚡️ Python lambda funksiyasi — qisqa, lekin qudratli
Pythonda funksiyalarni tez va oddiy yozish kerak bo‘lsa, lambda sizga yordam beradi. Lekin ko‘pchilik lambda faqat qisqalik uchun deb o‘ylaydi. Aslida u higher-order function, callback, va FP (Functional Programming) konseptlarida muhim rol o‘ynaydi.
🧠 lambda nima?
lambda — bu anonim (nomi yo‘q) funksiya. Ya'ni, def bilan alohida yozmasdan, bitta qator ichida oddiy funksiyani e'lon qilish usuli:
📌 Oddiy misollar:
Batafsil: komentda tushuntiriladi!👇
⚡️ Python lambda funksiyasi — qisqa, lekin qudratli
Pythonda funksiyalarni tez va oddiy yozish kerak bo‘lsa, lambda sizga yordam beradi. Lekin ko‘pchilik lambda faqat qisqalik uchun deb o‘ylaydi. Aslida u higher-order function, callback, va FP (Functional Programming) konseptlarida muhim rol o‘ynaydi.
🧠 lambda nima?
lambda — bu anonim (nomi yo‘q) funksiya. Ya'ni, def bilan alohida yozmasdan, bitta qator ichida oddiy funksiyani e'lon qilish usuli:
lambda argumentlar: natija
📌 Oddiy misollar:
square = lambda x: x * x
print(square(5)) # ➜ 25
add = lambda x, y: x + y
print(add(3, 4)) # ➜ 7
Batafsil: komentda tushuntiriladi!👇
👍1
#HigherOrderFunction(HOF)
1. 🔁 Higher-Order Function (HOF) nima?
Bu — funksiyani argument sifatida qabul qiladigan yoki natija sifatida qaytaradigan funksiyadir.
✅ Misol:
• lambda x: x * 2 — bu funksiya.
• apply() esa funksiyani argument sifatida qabul qildi ➝ bu higher-order function.
Batafsil: komentda tushuntiriladi!👇
1. 🔁 Higher-Order Function (HOF) nima?
Bu — funksiyani argument sifatida qabul qiladigan yoki natija sifatida qaytaradigan funksiyadir.
✅ Misol:
def apply(func, value):
return func(value)
result = apply(lambda x: x * 2, 10)
print(result) # 20
• lambda x: x * 2 — bu funksiya.
• apply() esa funksiyani argument sifatida qabul qildi ➝ bu higher-order function.
Batafsil: komentda tushuntiriladi!👇
#Callback
2. 🔄 Callback nima?
Bu — biror funksiya ichida boshqa bir funksiyani qayta chaqirish (callback).
✅ Misol:
• lambda: print("Done!") — callback funksiya sifatida uzatilmoqda.
• Odatda GUI, async, yoki event-based tizimlarda ishlatiladi.
Batafsil: komentda tushuntiriladi!👇
2. 🔄 Callback nima?
Bu — biror funksiya ichida boshqa bir funksiyani qayta chaqirish (callback).
✅ Misol:
def process_data(callback):
print("Processing...")
callback()
process_data(lambda: print("Done!"))
• lambda: print("Done!") — callback funksiya sifatida uzatilmoqda.
• Odatda GUI, async, yoki event-based tizimlarda ishlatiladi.
Batafsil: komentda tushuntiriladi!👇
#FunctionalProgramming
3. 🧠 Functional Programming (FP) nima?
Bu — dasturlashdagi yondashuv bo‘lib:
• funksiya — asosiy birlik
• kod — funksiyalar orqali yoziladi
• o‘zgaruvchan holatlar yo‘q yoki kamroq bo‘ladi
lambda, map(), filter(), reduce() kabi funksiyalar — FP yondashuvida juda muhim.
✅ Misol:
Bu yerda lambda funksiyasi — FP stilida ishlatilmoqda.
Batafsil: komentda tushuntiriladi!👇
3. 🧠 Functional Programming (FP) nima?
Bu — dasturlashdagi yondashuv bo‘lib:
• funksiya — asosiy birlik
• kod — funksiyalar orqali yoziladi
• o‘zgaruvchan holatlar yo‘q yoki kamroq bo‘ladi
lambda, map(), filter(), reduce() kabi funksiyalar — FP yondashuvida juda muhim.
✅ Misol:
numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, numbers))
print(squared) # [1, 4, 9, 16]
Bu yerda lambda funksiyasi — FP stilida ishlatilmoqda.
Batafsil: komentda tushuntiriladi!👇