*args vs **kwargs
1. Kirish
Python’da funksiya yozayotganda ba’zan nechta argument kelishini oldindan bilmaymiz. Masalan:
- Foydalanuvchi 3 ta son kiritishi mumkin, yoki 10 ta.
- Ba’zi ma’lumotlar ism bilan, ba’zilari esa kalit so‘z bilan kelishi mumkin.
Bunday holatlar uchun Python maxsus imkoniyat beradi:
- *args — istalgancha isimsiz (positional) argumentlarni qabul qiladi
- **kwargs — istalgancha kalit-so‘zli (named) argumentlarni qabul qiladi
Bu ikki imkoniyat dasturlashni juda moslashuvchan qiladi.
2. *args nima?
*args — funksiyaga uzatilgan barcha isimsiz argumentlarni tuple ko‘rinishida yig‘ib oladi.
- * belgisi majburiy
- args nomi shart emas (istalgan nom qo‘yish mumkin: *sonlar, *qiymatlar...)
- Ichida ma’lumotlar tuple sifatida saqlanadi
- Bo‘sh qoldirilsa, bo‘sh tuple (()) bo‘ladi
def salomlash(*ismlar):
print("Qabul qilingan argumentlar:", ismlar)
for ism in ismlar:
print(f"Salom, {ism}!")
salomlash("Ali", "Vali", "Guli")Qabul qilingan argumentlar: ('Ali', 'Vali', 'Guli')
Salom, Ali!
Salom, Vali!
Salom, Guli!def yigindi(*sonlar):
return sum(sonlar)
print(yigindi(1, 2, 3, 4)) # 10
print(yigindi(100, 200)) # 300
print(yigindi()) # 03. **kwargs nima?
**kwargs — funksiyaga uzatilgan barcha kalit-so‘zli argumentlarni lug‘at (dict) ko‘rinishida yig‘ib oladi.
- ** belgisi majburiy
- kwargs nomi shart emas (**malumotlar, **parametrlar ham bo‘lishi mumkin)
- Ichida ma’lumotlar dict sifatida saqlanadi
- Bo‘sh qoldirilsa, bo‘sh dict ({}) bo‘ladi
def malumot_chiqar(**kwargs):
print("Qabul qilingan lug‘at:", kwargs)
for kalit, qiymat in kwargs.items():
print(f"{kalit} → {qiymat}")
malumot_chiqar(ism="Ali", yosh=25, shahar="Toshkent")Qabul qilingan lug‘at: {'ism': 'Ali', 'yosh': 25, 'shahar': 'Toshkent'}
ism → Ali
yosh → 25
shahar → Toshkent4. *args va **kwargsni birga ishlatish
Ikkalasini bir funksiyada ishlatish mumkin. Tartib juda muhim:
def funksiya(oddiy1, oddiy2, *args, **kwargs):
...def shaxs(ism, yosh, *args, **kwargs):
print(f"Ism: {ism}")
print(f"Yosh: {yosh}")
print(f"Args: {args}")
print(f"Kwargs: {kwargs}")
shaxs("Ali", 22, "Toshkent", "O‘qituvchi", hobby="futbol", til="o‘zbek")Ism: Ali
Yosh: 22
Args: ('Toshkent', 'O‘qituvchi')
Kwargs: {'hobby': 'futbol', 'til': 'o‘zbek'}5. Amaliy masalalar va yechimlari
1-masala
Istalgancha son qabul qilib, ularning yig‘indisini qaytaradigan funksiya yozing.
def yigindi(*sonlar):
return sum(sonlar)
print(yigindi(1, 2, 3)) # 6
print(yigindi(10, 20, 30, 40)) # 100
print(yigindi()) # 02-masala
Istalgancha son qabul qilib, o‘rtacha qiymatini qaytaring. Sonlar bo‘lmasa — 0 qaytaring.
def ortacha(*sonlar):
if len(sonlar) == 0:
return 0
return sum(sonlar) / len(sonlar)
print(ortacha(10, 20, 30)) # 20.0
print(ortacha(5, 15)) # 10.0
print(ortacha()) # 03-masala
Istalgancha kalit-so‘zli argumentni kalit: qiymat ko‘rinishida chiqaring.
def malumot_chiqar(**kwargs):
for kalit, qiymat in kwargs.items():
print(f"{kalit}: {qiymat}")
malumot_chiqar(ism="Ali", yosh=25, shahar="Toshkent")4-masala
Istalgancha kalit-so‘zli argumentni lug‘at ko‘rinishida qaytaring.
def lugat_yarat(**kwargs):
return kwargs
print(lugat_yarat(a=1, b=2, c=3))
# {'a': 1, 'b': 2, 'c': 3}5-masala
2 ta majburiy parametr (ism, yosh), keyin *args va **kwargs qabul qiladigan funksiya yozing va barcha ma’lumotlarni chiqaring.
def shaxs(ism, yosh, *args, **kwargs):
print(f"Ism: {ism}")
print(f"Yosh: {yosh}")
if args:
print("Args:", args)
if kwargs:
print("Kwargs:")
for k, v in kwargs.items():
print(f" {k}: {v}")
shaxs("Ali", 22, "Toshkent", "O‘qituvchi", hobby="futbol", til="o‘zbek")6-masala
Istalgancha son ichidan eng kattasini toping. Sonlar bo‘lmasa — None qaytaring.
def maksimal(*sonlar):
if not sonlar:
return None
return max(sonlar)
print(maksimal(5, 12, 3, 9)) # 12
print(maksimal()) # None7-masala
Faqat qiymati son (int yoki float) bo‘lgan kalit-so‘zli argumentlarni yangi lug‘atga yig‘ib qaytaring.
def faqat_sonlar(**kwargs):
natija = {}
for kalit, qiymat in kwargs.items():
if isinstance(qiymat, (int, float)):
natija[kalit] = qiymat
return natija
print(faqat_sonlar(ism="Ali", yosh=25, bal=4.5, shahar="Samarqand"))
# {'yosh': 25, 'bal': 4.5}8-masala
*args dagi sonlar yig‘indisini va **kwargs dagi barcha qiymatlarni chiqaring.
def birlashtir(*args, **kwargs):
print("Args yig‘indisi:", sum(args) if args else 0)
print("Kwargs qiymatlari:")
for qiymat in kwargs.values():
print(" -", qiymat)
birlashtir(10, 20, 30, ism="Vali", yosh=30, kasb="Muhandis")
**`*args` va `**kwargs`** — Python’da funksiyaga o‘zgaruvchan
miqdordagi argumentlarni uzatish uchun ishlatiladigan maxsus parametrlar.
### 1. `*args` (yulduzcha args)
- Funksiyaga **isimsiz** (positional) argumentlarni istalgancha
uzatish imkonini beradi.
- Ichida ular **tuple** ko‘rinishida saqlanadi.
**Oddiy misol:**
```python
def salom(*args):
print(args) # tuple ko‘rinishida chiqadi
for ism in args:
print(f"Salom, {ism}!")
salom("Ali", "Vali", "Guli")
```
**Natija:**
```
('Ali', 'Vali', 'Guli')
Salom, Ali!
Salom, Vali!
Salom, Guli!
```
Yana bir misol (yig‘indi hisoblash):
```python
def yigindi(*sonlar):
return sum(sonlar)
print(yigindi(1, 2, 3)) # 6
print(yigindi(10, 20, 30, 40)) # 100
```
### 2. `**kwargs` (ikki yulduzcha kwargs)
- Funksiyaga **kalit so‘zli** (named) argumentlarni istalgancha
uzatish imkonini beradi.
- Ichida ular **lug‘at (dict)** ko‘rinishida saqlanadi.
**Oddiy misol:**
```python
def malumot(**kwargs):
print(kwargs) # dict ko‘rinishida
for kalit, qiymat in kwargs.items():
print(f"{kalit}: {qiymat}")
malumot(ism="Ali", yosh=25, shahar="Toshkent")
```
**Natija:**
```
{'ism': 'Ali', 'yosh': 25, 'shahar': 'Toshkent'}
ism: Ali
yosh: 25
shahar: Toshkent
```
### 3. Ikkalasini birga ishlatish
```python
def misol(a, b, *args, **kwargs):
print("a =", a)
print("b =", b)
print("args =", args)
print("kwargs =", kwargs)
misol(10, 20, 30, 40, 50, ism="Ali", yosh=25)
```
**Natija:**
```
a = 10
b = 20
args = (30, 40, 50)
kwargs = {'ism': 'Ali', 'yosh': 25}
```
### Qisqa eslatma
| Belgi | Nima qabul qiladi | Ichida qanday saqlanadi |
|-------------|----------------------------|--------------------------|
| `*args` | Isimsiz argumentlar | `tuple` |
| `**kwargs` | Kalit so‘zli argumentlar | `dict` |
**Muhim qoida:**
Funksiya parametrlarida tartib shunday bo‘lishi kerak:
`oddiy parametrlar` → `*args` → `**kwargs`
Masalan:
```python
def funksiya(x, y, *args, **kwargs): # to‘g‘ri
```
Masalalar
**`*args` va `**kwargs` bo‘yicha masalalar va javoblari**
Quyida 8 ta masala berilgan. Har birining yechimi va natijasi bilan.
---
### 1-masala (Oddiy `*args`)
Funksiya yozing. U istalgancha son qabul qilsin va ularning
yig‘indisini qaytarsin.
**Yechim:**
```python
def yigindi(*sonlar):
return sum(sonlar)
print(yigindi(1, 2, 3))
print(yigindi(10, 20, 30, 40, 50))
print(yigindi())
```
**Natija:**
```
6
150
0
```
---
### 2-masala (`*args` bilan o‘rtacha)
Funksiya yozing. U istalgancha son qabul qilsin va ularning
o‘rtacha qiymatini qaytarsin. Agar hech qanday son berilmasa,
`0` qaytarsin.
**Yechim:**
```python
def ortacha(*sonlar):
if len(sonlar) == 0:
return 0
return sum(sonlar) / len(sonlar)
print(ortacha(10, 20, 30))
print(ortacha(5, 15))
print(ortacha())
```
**Natija:**
```
20.0
10.0
0
```
---
### 3-masala (`**kwargs` bilan ma’lumot chiqarish)
Funksiya yozing. U istalgancha kalit-so‘zli argument qabul qilsin va
har birini `kalit: qiymat` ko‘rinishida chiqarsin.
**Yechim:**
```python
def malumot_chiqar(**kwargs):
for kalit, qiymat in kwargs.items():
print(f"{kalit}: {qiymat}")
malumot_chiqar(ism="Ali", yosh=25, shahar="Toshkent")
print("---")
malumot_chiqar(nom="Python", daraja="Boshlang‘ich")
```
**Natija:**
```
ism: Ali
yosh: 25
shahar: Toshkent
---
nom: Python
daraja: Boshlang‘ich
```
---
### 4-masala (`**kwargs` bilan lug‘at qaytarish)
Funksiya yozing. U istalgancha kalit-so‘zli argument qabul qilsin
va ularni lug‘at (dict) ko‘rinishida qaytarsin.
**Yechim:**
```python
def lugat_yarat(**kwargs):
return kwargs
print(lugat_yarat(a=1, b=2, c=3))
print(lugat_yarat(ism="Guli", kasb="Dasturchi"))
```
**Natija:**
```
{'a': 1, 'b': 2, 'c': 3}
{'ism': 'Guli', 'kasb': 'Dasturchi'}
```
---
### 5-masala (`*args` va `**kwargs` birga)
Funksiya yozing. U:
- 2 ta majburiy parametr (`ism`, `yosh`) qabul qilsin
- keyin istalgancha isimsiz argument (`*args`)
- keyin istalgancha kalit-so‘zli argument (`**kwargs`)
Funksiya barcha ma’lumotlarni chiroyli chiqarsin.
**Yechim:**
```python
def shaxs(ism, yosh, *args, **kwargs):
print(f"Ism: {ism}")
print(f"Yosh: {yosh}")
if args:
print("Qo‘shimcha ma’lumotlar (args):", args)
if kwargs:
print("Qo‘shimcha ma’lumotlar (kwargs):")
for k, v in kwargs.items():
print(f" {k}: {v}")
shaxs("Ali", 22, "Toshkent", "O‘qituvchi", hobby="futbol", til="o‘zbek")
```
**Natija:**
```
Ism: Ali
Yosh: 22
Qo‘shimcha ma’lumotlar (args): ('Toshkent', 'O‘qituvchi')
Qo‘shimcha ma’lumotlar (kwargs):
hobby: futbol
til: o‘zbek
```
---
### 6-masala (Maksimal topish)
Funksiya yozing. U istalgancha son qabul qilsin va
eng kattasini qaytarsin. Agar hech narsa berilmasa, `None` qaytarsin.
**Yechim:**
```python
def maksimal(*sonlar):
if not sonlar:
return None
return max(sonlar)
print(maksimal(5, 12, 3, 9))
print(maksimal(100))
print(maksimal())
```
**Natija:**
```
12
100
None
```
---
### 7-masala (`**kwargs` bilan filtr)
Funksiya yozing. U istalgancha kalit-so‘zli argument qabul
qilsin va faqat **qiymati son** bo‘lganlarini yangi lug‘atga
yig‘ib qaytarsin.
**Yechim:**
```python
def faqat_sonlar(**kwargs):
natija = {}
for kalit, qiymat in kwargs.items():
if isinstance(qiymat, (int, float)):
natija[kalit] = qiymat
return natija
print(faqat_sonlar(ism="Ali", yosh=25, bal=4.5, shahar="Samarqand", ball=90))
```
**Natija:**
```
{'yosh': 25, 'bal': 4.5, 'ball': 90}
```
---
### 8-masala (Barcha narsani birlashtirish)
Funksiya yozing. U istalgancha isimsiz va kalit-so‘zli
argument qabul qilsin.
- `*args` dagi barcha sonlarni qo‘shib chiqarsin
- `**kwargs` dagi barcha qiymatlarni chiqarsin
**Yechim:**
```python
def birlashtir(*args, **kwargs):
print("Args yig‘indisi:", sum(args) if args else 0)
print("Kwargs qiymatlari:")
for qiymat in kwargs.values():
print(" -", qiymat)
birlashtir(10, 20, 30, ism="Vali", yosh=30, kasb="Muhandis")
```
**Natija:**
```
Args yig‘indisi: 60
Kwargs qiymatlari:
- Vali
- 30
- Muhandis
```
---