🧩 3-qism: List comprehensionlar — ro‘yxatlarni qisqa yo‘l bilan yaratish
Listlar Pythonning qudratli tuzilmasi. List comprehensionlar yordamida oddiy for sikli bilan yozilgan kodni qisqa, o‘qilishi oson shaklga kiritamiz. Ular tez-tez ro‘yhatlardan filtrlar qo‘llash, ma’lumotlar ustida transformatsiya qilish uchun ishlatiladi. Shunchaki mos yozuvlar va ifoda bilan bir nechta satrda mavjud natijaga erishamiz. Bu usul kodni 2x tezroq yozish imkonini berdi, ayni paytda tushunarli bo‘lib qoladi. 😊
Misol: biz 1 dan 20 gacha bo‘lgan sonlardan faqat juft sonlarni topamiz. Oddiy for sikli o‘rniga list comprehensiondan foydalanamiz. Natija toza ro‘yxat bo‘lib, har bir element o‘z o‘rnida saqlanadi.
Output:
Bu yerda n — har bir element, for n in numbers — ro‘yxat bo‘ylab aylanadi, if n % 2 == 0 esa shart. Agar talab bo‘lsa, hamma noldan tashqari qiymatlar ham qo‘shilishi mumkin. Masalan, har bir raqamning kvadratini olish uchun [n**2 for n in numbers] yozamiz. Qisqa, samarali, xuddi shunga o‘xshash transformatsiyalar uchun list comprehensionlar juda mos keladi. ✅
Savol: Sizda list comprehension bilan qaysi holat eng foydali bo‘ldi? Yoki oddiy for sikli bilan ishlashni afzal ko‘rasizmi? Fikrlaringizni yozib qoldiring. 👇
Listlar Pythonning qudratli tuzilmasi. List comprehensionlar yordamida oddiy for sikli bilan yozilgan kodni qisqa, o‘qilishi oson shaklga kiritamiz. Ular tez-tez ro‘yhatlardan filtrlar qo‘llash, ma’lumotlar ustida transformatsiya qilish uchun ishlatiladi. Shunchaki mos yozuvlar va ifoda bilan bir nechta satrda mavjud natijaga erishamiz. Bu usul kodni 2x tezroq yozish imkonini berdi, ayni paytda tushunarli bo‘lib qoladi. 😊
Misol: biz 1 dan 20 gacha bo‘lgan sonlardan faqat juft sonlarni topamiz. Oddiy for sikli o‘rniga list comprehensiondan foydalanamiz. Natija toza ro‘yxat bo‘lib, har bir element o‘z o‘rnida saqlanadi.
# juft sonlar ro'yxatini qisqa shaklda olish
numbers = range(1, 21)
evens = [n for n in numbers if n % 2 == 0]
print(evens)
Output:
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
Bu yerda n — har bir element, for n in numbers — ro‘yxat bo‘ylab aylanadi, if n % 2 == 0 esa shart. Agar talab bo‘lsa, hamma noldan tashqari qiymatlar ham qo‘shilishi mumkin. Masalan, har bir raqamning kvadratini olish uchun [n**2 for n in numbers] yozamiz. Qisqa, samarali, xuddi shunga o‘xshash transformatsiyalar uchun list comprehensionlar juda mos keladi. ✅
Savol: Sizda list comprehension bilan qaysi holat eng foydali bo‘ldi? Yoki oddiy for sikli bilan ishlashni afzal ko‘rasizmi? Fikrlaringizni yozib qoldiring. 👇
Sarlavha: Python bilan Fayllar bilan Ishlash — oddiy misol: matn faylini o‘qib yozish va o‘zgartirish 📂🐍
Mavzu qisqacha tushuntirish: Fayllar bilan ishlash — Pythonning asosiy ko‘nikmalaridan. Bu misolda biz matn faylini o‘qib, har bir qatorni o‘zgartirib yangi faylga yozamiz. Amaliyot faylga yozish/oqish asoslarini amalda ko‘rsatadi, ya'ni real dunyodagi loglar, natijalar yoki matn fayllarini avtomatik tayyorlash uchun qulay. Quyidagi kod yordamida biz avvalo namunaviy fayl yaratamiz, undan o‘qib, satrlarni o‘zlashtirib yozamiz, so‘ng natijani ko‘rsatamiz. Muammo yoqsa o‘zgartirib, o‘z ish jarayonlaringizga moslashtirishingiz mumkin. ⚙️🔍
Kod misoli (real va ishlaydigan):
Kod natijasi (Output):
1. ASSALOMU ALAYKUM!
2. BU MISOLDA FAYL BILAN ISHLASH BO‘YICHA ODDIY AMALIYOT KO'RS ATAMAN.
3. HAR BIR QATORNI O'ZGARTIRISH UCHUN PYTHON KODINI YOZAMIZ.
Sizningcha, fayl bilan ishlash jarayonlarini automatlashtirish uchun yana qaysi amallarni (masalan, filtrlash, qatorlarni indekslash, kodlashtirish o‘zgartirish) qo‘shishni istardingiz? Commentsda o‘zingizga mos misollarni yozing yoki loyihaingizdagi eng qiyin fayl-salonini tasvirlab bering! 💬🤖
Mavzu qisqacha tushuntirish: Fayllar bilan ishlash — Pythonning asosiy ko‘nikmalaridan. Bu misolda biz matn faylini o‘qib, har bir qatorni o‘zgartirib yangi faylga yozamiz. Amaliyot faylga yozish/oqish asoslarini amalda ko‘rsatadi, ya'ni real dunyodagi loglar, natijalar yoki matn fayllarini avtomatik tayyorlash uchun qulay. Quyidagi kod yordamida biz avvalo namunaviy fayl yaratamiz, undan o‘qib, satrlarni o‘zlashtirib yozamiz, so‘ng natijani ko‘rsatamiz. Muammo yoqsa o‘zgartirib, o‘z ish jarayonlaringizga moslashtirishingiz mumkin. ⚙️🔍
Kod misoli (real va ishlaydigan):
# 1) Namuna matn faylini yaratamiz
sample_lines = [
"Assalomu alaykum!",
"Bu misolda fayl bilan ishlash bo‘yicha oddiy amaliyot ko'rsataman.",
"Har bir qatorni o'zgartirish uchun Python kodini yozamiz."
]
with open('sample.txt', 'w', encoding='utf-8') as f:
f.write("\n".join(sample_lines))
# 2) Faylni o‘qish, har bir qatorni yuqori balandlikka o‘zgartirish
with open('sample.txt', 'r', encoding='utf-8') as f:
lines = f.read().splitlines()
# 3) Qatorlarni o'zgartirish va yangi faylga yozish
processed = [f"{i+1}. {line.upper()}" for i, line in enumerate(lines)]
with open('out.txt', 'w', encoding='utf-8') as f:
f.write("\n".join(processed))
# 4) Natijani chiqarishga tayyorgarlik
print("Natija:")
print("\n".join(processed))
Kod natijasi (Output):
1. ASSALOMU ALAYKUM!
2. BU MISOLDA FAYL BILAN ISHLASH BO‘YICHA ODDIY AMALIYOT KO'RS ATAMAN.
3. HAR BIR QATORNI O'ZGARTIRISH UCHUN PYTHON KODINI YOZAMIZ.
Sizningcha, fayl bilan ishlash jarayonlarini automatlashtirish uchun yana qaysi amallarni (masalan, filtrlash, qatorlarni indekslash, kodlashtirish o‘zgartirish) qo‘shishni istardingiz? Commentsda o‘zingizga mos misollarni yozing yoki loyihaingizdagi eng qiyin fayl-salonini tasvirlab bering! 💬🤖
Sarlavha: List comprehension bilan Python ro‘yxatlarini tez hosil qilamiz 📋 (List comprehension)
Nazariy tushuntirish:
- List comprehension — Python’da ro‘yxatlarni soddaroq va tez yaratish vositasi.
- Oddiy for loop o‘rniga bitta qator ifodada yozish mumkin.
- Üstiga shartlar qo‘yish, har bir elementga amallarni qo‘llash mumkin.
- Kod o‘qilishi oson, samaradorlik esa yuqori bo‘ladi.
Amaliy kod misoli:
Kod natijasi (Output):
Output: [0, 4, 16, 36, 64]
Savol (obunachilardan fikr): List comprehensionni yanada qiyinroq holatda qanday qo‘llash mumkin? Masalan, matnlar ro‘yxatidan faqat uzun bo‘lmaganlarini va har birini bosh harf bilan yashirishsiz chiqarish usullari bormi? Siz qaysi misollarni ko‘proq yoqtirasiz? 💬
Nazariy tushuntirish:
- List comprehension — Python’da ro‘yxatlarni soddaroq va tez yaratish vositasi.
- Oddiy for loop o‘rniga bitta qator ifodada yozish mumkin.
- Üstiga shartlar qo‘yish, har bir elementga amallarni qo‘llash mumkin.
- Kod o‘qilishi oson, samaradorlik esa yuqori bo‘ladi.
Amaliy kod misoli:
# 0 dan 9 gacha bo‘lgan sonlarning juftlarini kvadratlari ro'yxatini yarataylik
juft_kvadratlar = [x*x for x in range(10) if x % 2 == 0]
print(juft_kvadratlar)
Kod natijasi (Output):
Output: [0, 4, 16, 36, 64]
Savol (obunachilardan fikr): List comprehensionni yanada qiyinroq holatda qanday qo‘llash mumkin? Masalan, matnlar ro‘yxatidan faqat uzun bo‘lmaganlarini va har birini bosh harf bilan yashirishsiz chiqarish usullari bormi? Siz qaysi misollarni ko‘proq yoqtirasiz? 💬
6) CSV fayllar bilan ishlashning oddiy yo‘li 📁✨
CSV — yengil formatdagi ma’lumotlar jadvali. Python bilan uni o‘qish, yozish tez va sodda. csv moduli yordamida har xil qatorlarni oson parchalab, yangilarini qo‘shish mumkin. Agar katta ma’lumotlar bo‘lsa, pandas yordami bilan ham samarali ishlash mumkin, lekin oddiy vaziyatlar uchun csv – juda qulay.
Quyida oddiy misol: ro‘yxatdan olingan foydalanuvchilarni CSV ga yozamiz, so‘ngra o‘qib chiqamiz. Bu amaliyot sizga “ma’lumotlar orkestratsiyasi” haqida tushuncha beradi va real loyihalarda tez yordam beradi.
Chiqqan natija (Output):
{'name': 'Ali', 'age': '30', 'city': 'Toshkent'}
{'name': 'Dilfuza', 'age': '25', 'city': 'Samarqand'}
{'name': 'Kamola', 'age': '28', 'city': 'Buxoro'}
Yakuniy fikr: CSV bilan ishlash yuzaki ma’lumotdan to‘g‘ri formatga o‘tishda keng qo‘llanadi. Sizincha, real loyihalarda CSV ning qirg‘og‘idan qaysi holatlarda Pandas ga o‘tish maqbulroq? Aytib berishingiz mumkinmi?
CSV — yengil formatdagi ma’lumotlar jadvali. Python bilan uni o‘qish, yozish tez va sodda. csv moduli yordamida har xil qatorlarni oson parchalab, yangilarini qo‘shish mumkin. Agar katta ma’lumotlar bo‘lsa, pandas yordami bilan ham samarali ishlash mumkin, lekin oddiy vaziyatlar uchun csv – juda qulay.
Quyida oddiy misol: ro‘yxatdan olingan foydalanuvchilarni CSV ga yozamiz, so‘ngra o‘qib chiqamiz. Bu amaliyot sizga “ma’lumotlar orkestratsiyasi” haqida tushuncha beradi va real loyihalarda tez yordam beradi.
import csv
# 1) Yozish
data = [
{"name": "Ali", "age": 30, "city": "Toshkent"},
{"name": "Dilfuza", "age": 25, "city": "Samarqand"},
{"name": "Kamola", "age": 28, "city": "Buxoro"},
]
with open("users.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["name", "age", "city"])
writer.writeheader()
for row in data:
writer.writerow(row)
# 2) O'qish
with open("users.csv", "r", newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(row)
Chiqqan natija (Output):
{'name': 'Ali', 'age': '30', 'city': 'Toshkent'}
{'name': 'Dilfuza', 'age': '25', 'city': 'Samarqand'}
{'name': 'Kamola', 'age': '28', 'city': 'Buxoro'}
Yakuniy fikr: CSV bilan ishlash yuzaki ma’lumotdan to‘g‘ri formatga o‘tishda keng qo‘llanadi. Sizincha, real loyihalarda CSV ning qirg‘og‘idan qaysi holatlarda Pandas ga o‘tish maqbulroq? Aytib berishingiz mumkinmi?
💩2
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.
Output:
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?
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):
Kodni ishga tushirganda chiqishi (Output):
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?
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.
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! 👇
🔎 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.
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?
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’rganing
Тeztan o’rganish jarayonida Python dasturlarning yagona vazifasi - ma’lumotni to’g’ri shaklda qabul qilib, foydalanuvchiga foydali natijalarni chiqarishdir. Telegram kanalda foydalanuvchilar bilan samarali muloqotni tashkil etish uchun oddiy matn bilan birga ko’rsatuvli formatlash, xabarlarni tayyorlash va qisqa kod fragmentlari yordamida avtomatlashtirilgan javoblar yozish mumkin. Bu mavzuda biz funktsiyalar,tekshirish,
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?
Тeztan o’rganish jarayonida Python dasturlarning yagona vazifasi - ma’lumotni to’g’ri shaklda qabul qilib, foydalanuvchiga foydali natijalarni chiqarishdir. Telegram kanalda foydalanuvchilar bilan samarali muloqotni tashkil etish uchun oddiy matn bilan birga ko’rsatuvli formatlash, xabarlarni tayyorlash va qisqa kod fragmentlari yordamida avtomatlashtirilgan javoblar yozish mumkin. Bu mavzuda biz funktsiyalar,
f-strings kabi vositalarni qo’llab ko’rib, qanday qilib Python ekosistemasida samarali ish ko’rsatish mumkinligini ko’rib chiqamiz. Mavzu bo’yicha, kichik amaliy misol yordamida def yordamida funksiyani yaratish, print bilan natijani formatlash, shuningdek __name__ == "__main__" shabloni orqali soddalashgan yozuvni ko’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'oyasi bo’lsa, bu darsning oxirida berilgan misol sizga foydali bo’ladi. Bizning maqsad — uniform formatdagi kodlar bilan o’qishni osonlashtirish va Telegram Bot API bilan mos keladigan amaliyotga tayyorgarlik ko’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.
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:
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?
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.
Sizningcha, dekoratorlar orqali qanday kengaytirilgan xatti-harakatlar (masalan, autentifikatsiya tekshiruvi, caching yoki o‘lchovlar) yozishni ko‘rib chiqqaningiz bormi?
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.
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.
Savol: Siz funksiyalarni yozishda qanday vazifalarni oddiyroq qilib ko‘rib chiqasiz: argumentlar soni ko‘p bo‘lganmi yoki turli turlarda kiritiladigan ma’lumotlar?
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.
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?
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 operasiyalarni yengillashtiradi.
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?
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 operasiyalarni 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))