August 18

*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.

Asosiy xususiyatlari:

  • * 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

Oddiy misol:

Python

def salomlash(*ismlar):
    print("Qabul qilingan argumentlar:", ismlar)
    for ism in ismlar:
        print(f"Salom, {ism}!")

salomlash("Ali", "Vali", "Guli")

Natija:

text

Qabul qilingan argumentlar: ('Ali', 'Vali', 'Guli')
Salom, Ali!
Salom, Vali!
Salom, Guli!

Yana bir misol — yig‘indi:

Python

def yigindi(*sonlar):
    return sum(sonlar)

print(yigindi(1, 2, 3, 4))      # 10
print(yigindi(100, 200))        # 300
print(yigindi())                # 0

3. **kwargs nima?

**kwargs — funksiyaga uzatilgan barcha kalit-so‘zli argumentlarni lug‘at (dict) ko‘rinishida yig‘ib oladi.

Asosiy xususiyatlari:

  • ** 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

Oddiy misol:

Python

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")

Natija:

text

Qabul qilingan lug‘at: {'ism': 'Ali', 'yosh': 25, 'shahar': 'Toshkent'}
ism → Ali
yosh → 25
shahar → Toshkent

4. *args va **kwargsni birga ishlatish

Ikkalasini bir funksiyada ishlatish mumkin. Tartib juda muhim:

Python

def funksiya(oddiy1, oddiy2, *args, **kwargs):
    ...

To‘g‘ri tartib:

  1. Oddiy (majburiy) parametrlar
  2. *args
  3. **kwargs

Misol:

Python

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")

Natija:

text

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.

Python

def yigindi(*sonlar):
    return sum(sonlar)

print(yigindi(1, 2, 3))           # 6
print(yigindi(10, 20, 30, 40))     # 100
print(yigindi())                   # 0

2-masala

Istalgancha son qabul qilib, o‘rtacha qiymatini qaytaring. Sonlar bo‘lmasa — 0 qaytaring.

Python

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())                   # 0

3-masala

Istalgancha kalit-so‘zli argumentni kalit: qiymat ko‘rinishida chiqaring.

Python

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.

Python

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.

Python

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.

Python

def maksimal(*sonlar):
    if not sonlar:
        return None
    return max(sonlar)

print(maksimal(5, 12, 3, 9))       # 12
print(maksimal())                  # None

7-masala

Faqat qiymati son (int yoki float) bo‘lgan kalit-so‘zli argumentlarni yangi lug‘atga yig‘ib qaytaring.

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"))
# {'yosh': 25, 'bal': 4.5}

8-masala

*args dagi sonlar yig‘indisini va **kwargs dagi barcha qiymatlarni chiqaring.

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")

**`*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
```

---