Pojedyncza gwiazda *
rozpakowuje sekwencję / kolekcję na argumenty pozycyjne, więc możesz to zrobić:
def sum(a, b):
return a + b
values = (1, 2)
s = sum(*values)
Spowoduje to rozpakowanie krotki, aby faktycznie była wykonywana jako:
s = sum(1, 2)
Gwiazda podwójna **
robi to samo, używając tylko słownika i nazwanych argumentów:
values = { 'a': 1, 'b': 2 }
s = sum(**values)
Możesz również łączyć:
def sum(a, b, c, d):
return a + b + c + d
values1 = (1, 2)
values2 = { 'c': 10, 'd': 15 }
s = sum(*values1, **values2)
wykona jako:
s = sum(1, 2, c=10, d=15)
Zobacz także sekcję 4.7.4 - Rozpakowywanie list argumentów w dokumentacji Pythona.
Dodatkowo możesz zdefiniować funkcje do pobrania *x
i **y
argumenty, dzięki czemu funkcja może zaakceptować dowolną liczbę pozycyjnych i / lub nazwanych argumentów, które nie są wyraźnie wymienione w deklaracji.
Przykład:
def sum(*values):
s = 0
for v in values:
s = s + v
return s
s = sum(1, 2, 3, 4, 5)
lub z **
:
def get_a(**values):
return values['a']
s = get_a(a=1, b=2)
umożliwia to określenie dużej liczby parametrów opcjonalnych bez konieczności ich deklarowania.
I znowu możesz łączyć:
def sum(*values, **options):
s = 0
for i in values:
s = s + i
if "neg" in options:
if options["neg"]:
s = -s
return s
s = sum(1, 2, 3, 4, 5)
s = sum(1, 2, 3, 4, 5, neg=True)
s = sum(1, 2, 3, 4, 5, neg=False)