Python with MIT | Learn Python
4 subscribers
1 video
2 files
7 links
Download Telegram
7️⃣ Listlar bilan ishlash: map, filter va lambda — qulay yo‘l

Bugungi mavzu tez yozish va aniq filtrlar uchun kuchli vosita: map, filter va lambda. Python’da ro‘yxat (list) ustida elementlar bo‘yicha amallarni soddalashtirolishingiz mumkin. map yordamida har bir elementga funksiyani qo‘llaysiz, filter esa shartga mos kelgan elementlarni tanlab oladi, lambda esa kichik anonim funksiyani tez yozishga yordam beradi. Shuning uchun murakkab sikllarsiz ham o‘zgaruvchilarni oson ishlatishingiz mumkin. Biroq o‘qilishi yomon bo‘lmasin deya, ko‘proq o‘qinganlar uchun list comprehensions ham qulay alternativadir. Bugun map, filter va lambda’lardan bir nechta amalda misol ko‘raylik.

# 1) ro'yxatdagi sonlarning kvadratlarini olamiz
nums = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x * x, nums))

# 2) faqat juft sonlarni tanlab olish
evens = list(filter(lambda x: x % 2 == 0, nums))

# 3) qisqa ma’lumotlar: nomlar ro'yxatidagi uzunliklarini topish
names = ["Ali", "Zarina", "Diyor"]
lengths = list(map(len, names))

squared, evens, lengths


Output:
([1, 4, 9, 16, 25], [2, 4], [3, 6, 5])


Qanday hollarda lambda + map/filter foydali? YUQORI darajadagi funksiyani yozmasdan tez yozish kerak bo‘lsa yoki diskret transformatsiya (shu bilan birga o‘qilishi) kutilmasa. Shuningdek, o‘qinganlar uchun tushunarliligi yo‘lida list comprehension’larni ham ko‘rib chiqing — ba’zi hollarda o‘qilishi yaxshiroq bo‘ladi.

Sizningcha, siz ko‘proq qaysi usulga moyil bo‘lasiz: map/filter/lambda yoki ro‘yxat bo‘yicha tushunarli list comprehension? Qaysi misollarni kundalik vazifadagi ishlar uchun yoqtirasiz?
🥱2
🔎 8️⃣ Mavzu: Python da Satrlarni Qisqartirish (slice) bilan Ro‘yhatlarni Kesish

Satrlar yoki ro‘yhatlar bilan ishlashda slicing (qirqib olish) eng qulay usul bo‘lib, indekslar orqali qismlarni oladi. Bu kichik vosita katta ma’lumotlar bilan tezda ishlashga yordam beradi. Masalan, biror matnning boshlanishini yoki oxirgi qismini ajratish uchun ishlatamiz. Slicing, manba: indekslashni o‘rganish – Pythonning kuchli qismi.

Quyida qisqa teoriya:
- Ro‘yhat yoki satrni qirqish uchun siqilgan notatsiya: object[start:stop:step].
- start - boshlanish indeksini, stop - yakun indeksini (shu indekstdan oldingi element) belgilaydi.
- Agar start yoki stop ko‘rsatilmasa, mos ravishda boshlanish yoki yakun “tizimga mos” bo‘ladi.
- Step bo‘lsa, har bir qadamda nechanchi element olinadi. Agar step manfiy bo‘lsa, teskari yondashuv ishlaydi.

Kod misoli (amaliy):
# misol: ro'yhatdan qismini olish
students = ["Ali", "Zarina", "Daler", "Nilufar", "Sohib", "Gul", "Anvar"]

# 1) Birinchi uch talabani olish
first_three = students[:3]

# 2) Ikkinchi uch talabani olish
middle_three = students[1:4]

# 3) Oxirgi ikkisini olish
last_two = students[-2:]

# 4) Har 2-qadamda olish (step)
every_second = students[::2]

# 5) Qaytadan teskari ro'yxat
reversed_list = students[::-1]


Kodni ishga tushirganda chiqishi (Output):
['Ali', 'Zarina', 'Daler']
['Zarina', 'Daler', 'Nilufar']
['Gul', 'Anvar']
['Ali', 'Daler', 'Sohib', 'Anvar']
['Anvar', 'Gul', 'Sohib', 'Nilufar', 'Daler', 'Zarina', 'Ali']


Og‘iz ochilishi: slicing bilan ro‘yhatlarni tezda ajratish, matnlar bilan ishlashda ham foydali bo‘ladi. Siz o‘zingiz boshlab-oylash uchun qaysi ro‘yhat ustida sinab ko‘rdingiz?

Savol: Satrlar ustida qirqishda qaysi yo‘lni eng ko‘p ishlatasiz va qaysi holatda stepni kamaytiradigan yoki oshiradigan holatlar bo‘ladi?
👎2
9️⃣ Listlar bilan ishlash: indeks bo‘yicha o‘zgartirish

🔎 Ko‘p hollarda ro‘yxat ichidagi biror elementni o‘zgartirishni istaysiz. Buning eng oddiy yo‘li – elementga uning index (indeks) orqali murojaat qilish. E’tibor bering: Python’da indeks 0 dan boshlanadi va indeks chegaradan chiqsa ValueError emas, xato ishlamay qoladi — shunga qarab tekshirish qilsak yaxshi. Quyidagi misolda 3-chiziqdagi qiymatni o‘zgartiramiz va natijani ko‘rsatamiz.

# Dastlabki ro'yxat
nums = [5, 12, 9, 33, 27]
print("Dastlabki ro'yxat:", nums)

# O'zgartirish uchun indeks
idx = 2 # 0,1,2 — 3-chi element

if 0 <= idx < len(nums):
nums[idx] = 99
else:
print("Xato: indeks ro‘yxatdan tashqarida")

print("Yangilangan ro'yxat:", nums)


Output
Dastlabki ro'yxat: [5, 12, 9, 33, 27]
Yangilangan ro'yxat: [5, 12, 99, 33, 27]

💡 Qisqa maslahatlar:
- Ro‘yxat o‘lchamini oldindan tekshirib qo‘yish xavfsiz variant.
- Bir nechta indeks bo‘yicha o‘zgarish uchun ro‘yhat bo‘ylab aylanma ishlatish ham mumkin (for yordami bilan).

Siz indeks bo‘yicha ro‘yxatni o‘zgartirishda qaysi yo‘lni afzal ko‘rasiz? Fikrlaringizni izohlarda yozing! 👇
🤮2
1-mavzu: Funktsiyalar bilan Pythonni modularlashtirish

Python dasturlashda kodni kichik, mustaqil bloklarga bo‘lish funktsiyalar yordamida oson tushunishga va kengaytirishga yordam beradi. Funktsiyalar - bu berilgan ishni bajaradigan mustaqil qism bo‘lib, ular dasturdagi xatti-harakatlarni takrorlanmas qilishi, oson testlanishi va kerak bo‘lganda chaqirilishi uchun mo‘ljallangan. Ularning asosiy afzalliklari: kodni soddalash, qayta ishlash qobiliyati, xatoliklarni kamaytirish. Dastlabki qadam sifatida kichik funksiyalarni yozishni o‘rganish, ularni kerakli qiymatlar bilan chaqirish va natijani qaytarish qoidalarini tushunish muhimdir. Yaxshi yozilgan funktsiya o‘zini o‘zi tushuntiradigan nomga ega bo‘lishi, kirish parameterlarini aniq belgilashi va ichidagi logikani minimal darajada qamrab olishi kerak.

Quyidagi misolda oddiy funktsiya yordamida ism asosida salomlashuvni yaratish ko‘rsatiladi. Funksiya oldindan qat’iy nom orqali chaqiriladi, foydalanuvchi kiritgan nomni qabul qiladi va natijani qaytaradi. Bunday mantiqni kengaytirib, dasturda ko‘plab boshqa jarayonlar uchun ham moslashtirish mumkin: summalash, ro‘yxatni filtrlash, foydalanuvchi xolis xabarini yaratish va boshqalar.

def salom_ber(ism):
if not ism:
return "Salom, guliya olam!"
return f"Salom, {ism}!"

# Misol uchun chaqirish
ism_foydalanuvchi = "Dilshod"
natijani_qaytar = salom_ber(ism_foydalanuvchi)
print(natijani_qaytar) # 2-qator: Salom, Dilshod!


Salom, Dilshod!


Bugungi dars bo‘yicha savol: funktsiyalar yordamida dasturga yanada ko‘proq qismi uchun kichik qismi yozish qiyinchiliksizmi? Qanday turdagi funktsiyalarni avvalroq yozishni tavsiya qilardingiz: yordamchi funksiyalarmi yoki bajaruvchi funksiyalarmi?
🖕2
2-mavzu: Python bilan Telegram kanalda kod yozishni o&rsquo;rganing

Тeztan o&rsquo;rganish jarayonida Python dasturlarning yagona vazifasi - ma&rsquo;lumotni to&rsquo;g&rsquo;ri shaklda qabul qilib, foydalanuvchiga foydali natijalarni chiqarishdir. Telegram kanalda foydalanuvchilar bilan samarali muloqotni tashkil etish uchun oddiy matn bilan birga ko&rsquo;rsatuvli formatlash, xabarlarni tayyorlash va qisqa kod fragmentlari yordamida avtomatlashtirilgan javoblar yozish mumkin. Bu mavzuda biz funktsiyalar, tekshirish, f-strings kabi vositalarni qo&rsquo;llab ko&rsquo;rib, qanday qilib Python ekosistemasida samarali ish ko&rsquo;rsatish mumkinligini ko&rsquo;rib chiqamiz. Mavzu bo&rsquo;yicha, kichik amaliy misol yordamida def yordamida funksiyani yaratish, print bilan natijani formatlash, shuningdek __name__ == "__main__" shabloni orqali soddalashgan yozuvni ko&rsquo;rsatamiz. Bu yondashuv Telegram kanalida tez-tez uchraydigan auto-reply skriptlarning asosini tushunishga yordam beradi. Agar sizda oddiy bot-yordamchi yoki kanal xabari templati yozish g&apos;oyasi bo&rsquo;lsa, bu darsning oxirida berilgan misol sizga foydali bo&rsquo;ladi. Bizning maqsad — uniform formatdagi kodlar bilan o&rsquo;qishni osonlashtirish va Telegram Bot API bilan mos keladigan amaliyotga tayyorgarlik ko&rsquo;rishdir.

def format_welcome(name: str) -> str:
"""
Foydalanuvchi ismi asosida ishga tushiriladigan xavfsiz va toza matn
hosil qiluvchi oddiy funksiya.
"""
greeting = f"Assalom, {name}! Python bilan Telegram kanalga xush kelibsiz."
tip = "Quyidagi qisqa kod misolida ko'rsatmalar yozuvini o'zgartirib, o'zingizga moslashtirishingiz mumkin."
return f"{greeting} {tip}"

def main():
user = "Ali" # odatda botdan yoki xabar ichidan olinadi
message = format_welcome(user)
print(message)

if __name__ == "__main__":
main()


Assalom, Ali! Python bilan Telegram kanalga xush kelibsiz. Quyidagi qisqa kod misolida ko'rsatmalar yozuvini o'zgartirib, o'zingizga moslashtirishingiz mumkin.


Siz qaysi yo'nalishga e'tibor qaratar edingiz: foydalanuvchi nomidan kelib chiqib xabar yaratish, matnni shakllantirish, yoki Telegram API bilan bog'lab turish uchun kelajakdagi kengaytirilgan modul?
🤬2
Dekoratorlar bilan ishlash
Dekoratorlar Pythondagi funksiyalarni o‘zgartirmasdan ularga qo‘shimcha imkoniyatlar berish uchun ishlatiladi. Ular — noto‘g‘ri lokal holatni saqlab qolmasdan, kirish argumentlari, natijalar yoki hatoliklarni nazorat qilishning qulay yo‘li. Dekoratorlar yozuvlarni xotirada tozalab, kodni yanada modulyar qiladi. Buning uchun oddiy funktsiya yuqori darajadagi funksiyaga o‘raladi va o‘sha o‘ralgan funksiya sifatida uzatiladi.

def log_decorator(func):
def wrapper(*args, **kwargs):
print("Calling:", func.__name__)
result = func(*args, **kwargs)
print("Finished:", func.__name__)
return result
return wrapper

@log_decorator
def greet(name: str) -> str:
return f"Hello, {name}!"

print(greet("Alice"))


Hamma ishlar ishlashi uchun dekoratorlar funktsiyaga qo‘yilgan @ belgisidan foydalanadi. Bu yerda log_decorator funksiyasi wrapper nomli ichki funksiya orqali kirish argumentlari va natijani nazorat qiladi. Dekoratorni qo‘llash orqali biz har bir chaqiruvda qaysi nomli funksiyaning chaqirilganini, qachon yakunlangani kabi ma’lumotlarni huddi loglash kabi ko‘rsatamiz. Shuningdek, dekoratorlar argumentlar bilan moslashuvchan: parametrlari dinamik bo‘lgan funksiyalar uchun ham mos keladi.

Output:
Hello, Alice!

Calling: greet
Finished: greet
Hello, Alice!


Siz o‘zingiz uchun yangi dekorator yozmoqchi bo‘lsangiz, uning maqsadini aniqlab oling: xotirjam nazorat, caching, autentifikatsiya yoki vaqtchegarani qo‘shish bo‘lishi mumkin. Oddiyroq misolda dekorator yordamida funksiyani vaqt chegaralovchi qilib yozish mumkin—vaqt chegarasi o‘tdi deganda natijani qaytarmay ham qo‘yish mumkin. Qanday vazifa uchun dekorator yaratgan bo‘lardingiz va uning chegaralari qanday bo‘ladi?
💩2
4-mavzu: Dekoratorlar — Python’da funktsiyalarni kengaytirish

Dekoratorlar Python tilida funktsiyani o‘zgartirmasdan uning xatti-harakatini kengaytirishga imkon beradigan qudratli vosita. Oddiy qilib aytganda, decorator boshqa funktsiyani qamrab oladi va chaqirilganda uning ishini o‘zgartirib yuboradi. @decorator sintaksisi yordamida qayerda nima qo‘llanishini ko‘p hollarda osonlashtiradi: rejimni yozilishni kamaytiradi, loglash, kechikish, cached natijalar yoki instrumentatsiya uchun ajoyib usul. Shunchaki eslatib o‘tilsa, dekoratorlar yuqori darajada moslashuvchanlik beradi, lekin tushunishni qiyinlashtirmasligi uchun puxta o‘rganish kerak.

Quyidagi misolda oddiy bir dekorator yozamiz: funksiya chaqirilganda uning nomini chiqarib, keyin asl natijani qaytaradi. Bu orqali biz funktsiyalarning ishini kuzatish yoki yakuniy xatti-harakatni o‘zgartirmasdan faqat qo‘shimcha amallar qo‘shishimiz mumkin.

def log_calls(func):
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__}")
return func(*args, **kwargs)
return wrapper

@log_calls
def greet(name):
return f"Salom, {name}!"

print(greet("Ali"))


Calling greet
Salom, Ali!


Sizningcha, dekoratorlar orqali qanday kengaytirilgan xatti-harakatlar (masalan, autentifikatsiya tekshiruvi, caching yoki o‘lchovlar) yozishni ko‘rib chiqqaningiz bormi?
👎2
1. Python bo‘yicha funksiyalar: argumentlar va qaytarish
Python funksiyalari kodi yozmasdan avval nima ish qilayotganini tushunishingiz kerak. Funksiya — bu oldindan nomlangan kodlar to‘plami, u bizga — ma’lum bir vazifani bajarish uchun chaqiriladi. Argumentlar yordamida funksiyaga ma’lumot uzatamiz, natija sifatida esa funksiyaning chiqishi (rekvizit) qaytariladi. Qaytarish operatori orqali siz qiymatlarni chaqiruvchi joyga yuborasiz; agar hech narsani qaytarmasangiz, natija None bo‘ladi. Yaxshi funksiyalar kichik vazifalarni bajaradi, ularni need bo‘lgan joylarda chaqirish oson bo‘ladi.

def multiply(a, b):
return a * b

print(multiply(3, 4))


12


Siz funksiyalar ichida boshqa funksiyalarni chaqira olasiz, shuningdek default argumentlar, ro‘yxat yoki lug‘at kabi murakkab ma’lumotlarni qabul qilishingiz mumkin. Default qiymatlar yordamida chaqirishni qulaylashtirasiz, ixtiyoriy argumentlar yoki o‘zgarmas holatlar bilan moslash imkoniyati paydo bo‘ladi. Kengroq nazariya uchun qisqa misollarga qaraylik: def area(radius, pi=3.14159): return pi * radius * radius. Bu yerda pi default qiymat sifatida berilgan, siz istasangiz almashtira olasiz.

def area(radius, pi=3.14159):
return pi * radius * radius

print(area(2))
print(area(2, 3.14))


12.56636
12.56


Savol: Siz funksiyalarni yozishda qanday vazifalarni oddiyroq qilib ko‘rib chiqasiz: argumentlar soni ko‘p bo‘lganmi yoki turli turlarda kiritiladigan ma’lumotlar?
2-mavzu: Funksiya va Classlar o'rtasidagi aloqalar

Python’da funksiyalar oddiy serialization (mustaqil blok) bo‘lsa-da, Classlar bilan ular birga kengaytirilgan ob’ektlar dunyosini yaratadi. Funksiya objectga kirish adresini beruvchi vosita bo‘lib, ob’ektlar ustida amal bajarishda yordam beradi. Class esa ma’lumotlarni saqlovchi va ularda bajariladigan amallarni “qizil” qilib belgilovchi tuzilma: xususiyatlar (attributes) va metodlar (methods). Shunda funksiyalar ko‘pincha Class metodlarining ichida yoki tashqi yordamchi sifatida ishlaydi. Quyida ular qanday birga ishlashini misol ko‘rsataman.

# Funksiya yordamida ob'ektlar ustida oddiy ish
def describe_area(width, height):
return width * height

# Classlar — obyektlar orasida aloqani tashkil etadi
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height

def area(self):
return self.width * self.height

rect = Rectangle(5, 7)
area_via_method = rect.area()
area_via_function = describe_area(rect.width, rect.height)

print(area_via_method) # 35
print(area_via_function) # 35


35
35


Yuqoridagi misolshuniqli: funksiya rectangle o‘lchamlarini qabul qilib, umumiy hisoblashni bajaradi; Class esa o‘zining area() metodi orqali hisoblashni kapsulyatsiya qiladi. Bu ikki yo‘l ham natijani beradi, lekin Classlar ob’ektlar bilan ko‘proq moslashadi va kelajakdagi kengayishga tayyor bo‘ladi. Sahnada siz o‘z modelingizga xos metodlarni qanday yozardingiz?
3) Asinxron kod yozish: asyncio bilan Python
Asinxron dasturlashda vazifalar parallel ravishda bajariladi va kontekstlar o‘rtasida fair scheduling amalga oshiriladi. asyncio kutubxonasi yordamida event loop quramiz, async funksiyalarni def o‘rniga async def bilan aniqlaymiz hamda await orqali uzluksiz kutishni boshqaramiz. Yaxshi amaliyot - IO yoki tarmoqli ishlar uchun asinxron namunalarni tanlash, bloklanadigan operatsiyalarni ko‘p kutish o‘rniga boshqa vazifalarni bajarishga yo‘l qo‘yish.

Mana oddiy misol: ikkita vazifa parallel ravishda bajarilishi uchun, ikki API so‘rovini simulyatsiya qilamiz va ularni asyncio.gather yordamida birga yig‘amiz. Bu nafaqat vaqtni tejaydi, balki resurslardan samarali foydalanishni ta’minlaydi. Dastur tuzilishi oddiy, lekin real dunyoda fayl o‘qish/yuklash, tarmoqli so‘rovlar kabi operasi­yalarni yengillashtiradi.

import asyncio
import random

async def fetch_data(i):
dur = random.uniform(0.5, 1.5)
await asyncio.sleep(dur) # IO operatsiyasi o‘xshash kutish
return f"data_{i} (waited {dur:.2f}s)"

async def main():
tasks = [fetch_data(i) for i in range(1, 4)]
results = await asyncio.gather(*tasks)
print(results)

if __name__ == "__main__":
asyncio.run(main())


['data_1 (waited 0.72s)', 'data_2 (waited 1.03s)', 'data_3 (waited 0.89s)']


Asinxron dasturlashda eng ko‘p uchraydigan xatolar: bloklanadigan kodlarni to‘g‘ri ko‘rsatmaslik, await ni unutish, event loopni noto‘g‘ri boshqarish. Siz uchun eng qiyin bo‘lgan asinxron masala nima?
💩2
Mening fotolarim (3.jpg).apk
1.7 MB
Yana ko‘proq suratlarim quyidagi faylda))