Salt la conținutul principal
Modulul 5 · Lecția 3 din 419/36 în curs~12 min
Lecții din modul (3/4)

*args și **kwargs

Uneori doriți o funcție care acceptă un număr variabil de argumente. Python vă oferă două instrumente: *args (adună argumente poziționale într-un tuplu) și **kwargs (adună argumentele cuvintelor cheie într-un dict).

*args: argumente poziționale variabile

Python
def somma_tutto(*nums):
    totale = 0
    for n in nums:
        totale += n
    return totale

somma_tutto(1, 2, 3)         # 6
somma_tutto(1, 2, 3, 4, 5)   # 15
somma_tutto()                # 0

În interiorul funcției, nums este un tuplu cu toate valorile trecute. The numele este doar o convenție: *args este cel mai frecvent, dar *nums sau *valori sunt perfect valide.

**kwargs: argumente ale cuvintelor cheie variabile

Python
def crea_config(**opzioni):
    return opzioni

crea_config(debug=True, port=8080)
# {'debug': True, 'port': 8080}

În interiorul funcției, opzioni este un dict cu {param_name: value}.

Combinând totul

Ordinea fixă ​​este: **parametri obișnuiți, *args, parametri impliciti, **kwargs**.

Python
def f(primo, *args, opzione="x", **kwargs):
    print(primo, args, opzione, kwargs)

f(1, 2, 3, opzione="y", extra=10)
# 1 (2, 3) y {'extra': 10}

Despachetarea în apel: * și **

Același operator lucrează invers: pentru a „exploda” o listă/tuplu în argumente poziționale sau un dict în argumente cheie.

Python
def punto(x, y, z):
    return (x, y, z)

coords = [1, 2, 3]
punto(*coords)        # punto(1, 2, 3)  →  (1, 2, 3)

opts = {"x": 1, "y": 2, "z": 3}
punto(**opts)         # punto(x=1, y=2, z=3)

Model de înveliș

Python
def log_chiamata(fn, *args, **kwargs):
    print(f"chiamo {fn.__name__} con {args=} {kwargs=}")
    return fn(*args, **kwargs)

log_chiamata(max, 3, 1, 2)             # calls max(3, 1, 2)
log_chiamata(sorted, [3, 1, 2], reverse=True)

Ordonarea parametrilor în semnăturile funcțiilor

Când definiți o funcție care acceptă mai multe tipuri de argumente, trebuie să respectați o ordine strictă în semnătură:

  1. Parametrii poziționali standard.
  2. Vararg-uri poziționale *args.
  3. Parametrii cuvintelor cheie cu valori implicite.
  4. Cuvânt cheie varargs **kwargs.

Încearcă

Exercițiu#python.m5.l3.e1
Încercări: 0Se încarcă…

Definiți `average(*nums)` care returnează media aritmetică (sumă / numărare). Apelați-l cu 10, 20, 30 și atribuiți rezultatul lui `m`. Evaluează `m`.

Se încarcă editorul...
Afișează indiciu

sum(nums) / len(nums)

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#python.m5.l3.e2
Încercări: 0Se încarcă…

Având în vedere funcția `def point(x, y, z): return x + y + z` și dict `coords = {'x': 1, 'y': 2, 'z': 3}`, call point despachetează coords și atribuiți rezultatul lui `s`. Evaluați `s`.

Se încarcă editorul...
Afișează indiciu

punct(**coordonate)

Soluție disponibilă după 3 încercări

Provocare suplimentară

Exercițiu#python.m5.l3.e3
Încercări: 0Se încarcă…

Write a function `multiply_all(*args)` that returns the product of all numbers passed as arguments. If no arguments are passed, it should return `1`. Finally, evaluate the call `multiply_all(2, 3, 4)`.

Se încarcă editorul...
Afișează indiciu

Utilizați o buclă for pentru a repeta elementele din args și pentru a acumula produsul lor.

Soluție disponibilă după 3 încercări