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
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
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**.
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.
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ș
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ă:
- Parametrii poziționali standard.
- Vararg-uri poziționale
*args. - Parametrii cuvintelor cheie cu valori implicite.
- Cuvânt cheie varargs
**kwargs.
Încearcă
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`.
Afișează indiciu
sum(nums) / len(nums)
Soluție disponibilă după 3 încercări
Exercițiu de revizuire
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`.
Afișează indiciu
punct(**coordonate)
Soluție disponibilă după 3 încercări
Provocare suplimentară
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)`.
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