Modül dersleri (3/4)
*args ve **kwargs
Bazen değişken sayısını kabul eden bir işlev istersiniz.
argümanlar. Python size iki araç sunar: *args (konumsal argümanları toplar
bir demet içine) ve **kwargs (anahtar kelime argümanlarını bir dikte halinde toplar).
*args: değişken konumsal argümanlar
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() # 0Fonksiyonun içinde, nums tüm değerlerin aktarıldığı bir demet'tir.
ad yalnızca bir kuraldır: *args en yaygın olanıdır, ancak *nums veya
*valori tamamen geçerlidir.
**kwargs: değişken anahtar kelime argümanları
def crea_config(**opzioni):
return opzioni
crea_config(debug=True, port=8080)
# {'debug': True, 'port': 8080}Fonksiyonun içinde, opzioni, {param_name: value} içeren bir dict'dir.
Her şeyi birleştirmek
Sabit sıra şu şekildedir: **normal parametreler, *args, varsayılan parametreler, **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}Görüşmede paketin açılması: * ve **
Aynı operatör tam tersi şekilde çalışır: bir listeyi/tuple'ı "patlatmak" için konumsal argümanlara veya anahtar kelime argümanlarına bir dikte.
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)Sarma deseni
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)İşlev imzalarında parametre sıralaması
Birden fazla bağımsız değişken türünü kabul eden bir işlevi tanımlarken imzada katı bir sıraya uymanız gerekir:
- Standart konumsal parametreler.
- Konumsal değişkenler
*args. - Varsayılan değerlere sahip anahtar kelime parametreleri.
- Anahtar kelime
**kwargsvarargs.
Deneyin
Aritmetik ortalamayı (toplam / sayım) döndüren 'ortalama(*sayılar)'ı tanımlayın. 10, 20, 30 ile çağırın ve sonucu 'm'ye atayın. 'm'yi değerlendirin.
İpucu göster
toplam(sayılar) / len(sayılar)
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
`def point(x, y, z) fonksiyonu göz önüne alındığında: x + y + z`yi döndürün ve dict `coords = {'x': 1, 'y': 2, 'z': 3}`, çağrı noktası açma koordinatlarını çağırın ve sonucu `s`ye atayın. 'leri' değerlendirin.
İpucu göster
nokta(**kodlar)
3 denemeden sonra çözüm mevcut
Ek zorluk
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)`.
İpucu göster
Arg'lardaki öğeler üzerinde yineleme yapmak ve bunların çarpımlarını biriktirmek için bir for döngüsü kullanın.
3 denemeden sonra çözüm mevcut