To'plamlarni o'zgaruvchilarga ochib berish (unpacking).
Unpacking iterable(list, tuple, dict, set) tur qiymatlarini ochib, bir vaqtning o'zida bir nechta o'zgaruvchilarga tayinlash imkonini beradi. Oddiy qilib aytganda bir nechta qiymatni bitta to'plamdan olib, bir nechta o'zgaruvchiga joylash. Quyida birinchi oddiy misol bilan ko'ramiz:
Natija
Bu yerda numbers ichidagi elementlar a, b, c larga unpack(ochib berish) qilindi. Odatda eng ko'p tuple bilan
ishlatiladi.
Natija
Pythonda funksiyalar bir nechta qiymat qaytara oladi(tuple turida). Bu imkoniyat kod yozish jarayonida ko'p hollarda kodni sifatli va mantiqiy qismlarni yozishni osonlashtiradi. Quyidagi misolda funksiyadan qaytgan qiymatlarni unpack qilishni ko'ramiz:
Bu misolda natija name = "Ali", age = 25 ko'rinishida bo'ladi.
Bizda shunday holatlar bo'lishi mumkin to'plamda nechta element bo'lishi aniq bo'lmaydi bunday holatlarda unpacking ishlatilsa quyidagicha xatolik sodir bo'ladi:
Natija:
Bunday holatlar uchun Catch-all unpacking deb nomlangan usul mavjud bo'lib, agar qiymatlar soni aniq bo'lmasa unpack qilishda asosiy belgilangan qiymatlar olinadi qolganlari esa ro'yxat(list)da saqlanadi.
Catch-all unpacking:
| get_user_unpack.py | |
|---|---|
Natija:
Yulduzcha (*) operatori qolgan barcha elementlarni bitta o'zgaruvchida ro'yxat ko'rinishida saqlaydi. Elementlar soni
noma'lum bo'lgan to'plamlarda bu imkoniyat bilan ishlash foydali bo'ladi. Agar elementlar soni kam bo'lib qolgan taqdirda ham
bu imkoniyat ishlaydi faqat bu yerda [] bo'sh ro'yxat bo'ladi.
Keling yana bir misolni ko'ramiz. Tasavvur qiling talabalar baholarini qayta ishlaydigan funksiyamiz bor. Talabalar bir nechta test natijalariga ega. Biz birinchi va ikkinchi o'rindagilarni alohida ajratib, qolganlarini bir joyga yig'moqchimiz. Bu quyidagicha amalga oshiriladi:
| get_user_unpack.py | |
|---|---|
Bu yondashuv kodni soddalashtiradi va indexdan yoki murakkab sikllardan foydalanishga ehtiyoj qoldirmaydi.
Endi yana bir holatni ko'rib chiqamiz. Bizga faqat talabalar ichida birinchi va oxirgi o'rindagilari kerak, qolganlari esa kerak emas. Eski Python(python < 3) kodlarida bu odatda indekslash va slicing orqali amalga oshirilgan. Ammo catch-all unpacking yordamida buni ancha ixcham yozish mumkin.
| get_user_unpack.py | |
|---|---|
Bu yerda _ (underscore) o'zgaruvchi nomi sifatida ishlatiladi, Pythonda bu qiymat "muhim emas" yoki
kerak emas degan ma'noni bildiradi.
Endi catch-all unpacking funksiya argumentida qanday ishlatilishini ko'ramiz. Pythonda funksiyalar *args orqali
noma'lum uzunlikdagi argumentlarni qabul qilish mumkin. Bu yerda *args kabi parametrlar qo'shimcha argumentlarni tuple
to'plamida saqlaydi, bu funksiyani moslashuvchan qiladi.
Bu yerda tuple turi ustida amallar bajariladi.
Agar funksiya argumentlari nomlangan bo'lsa, **kwargs ko'rinishida argument e'lon qilinadi. Berilgan argumentlar dict
ko'rinishida saqlanadi.
| unpacking.py | |
|---|---|
Bu yerdagi qiymat bilan ishlaganda dict ustida amallar bajariladi.
Info
*argsko'p oddiy argumentlar uchun.**kwargsko'p nomli argumentlar uchun.
Tip
args va kwargs aynan shu nomlar bo'lishi shart emas. Nomlash boshqacha bo'lishi mumkin:
*args va **kwargs ko'rinishida nomlash standart bo'lgani uchun shunday nomlash tavfsiya etiladi.
Funksiyaga argumentlar berishda tartibiga e'tibor berish juda muhim. Agar e'tibor berilmasa SyntaxError sodir bo'ladi.
Bu yerda parametrlar quyidagi ketma-ketlikda bo'ladi:
- Oddiy parametrlar.
- Boshlang'ich qiymatli parametrlar
*args- Nomlangan parametrlar
**kwargs
Info
Boshlang'ich qiymatli parametrlar oddiy parametrdan oldin kelolmaydi.
Qisqa qilib aytganda, * va ** operatorlari Pythonning kuchli imkoniyati bo'lib, ular yordamida kod yanada ixcham,
moslashuvchan va samarali bo'ladi.