7.1 Zugriff auf alle Funktionsargumente
In Python gibt es einige sehr praktische Möglichkeiten, um innerhalb einer Funktion die Liste aller an sie übergebenen Parameter zu erhalten. Lass uns diese durchgehen.
Verwendung von *args
*args
ermöglicht es, eine variable Anzahl von
positionsbasierte (gewöhnliche) Argumente an eine Funktion zu übergeben. Diese Argumente
werden in einem Tupel verpackt und können innerhalb der
Funktion bearbeitet werden.
def print_numbers(*args):
for arg in args:
print(arg)
print_numbers(1, 2, 3, 4, 5)
Erklärung
Die Funktion print_numbers
nimmt eine beliebige Anzahl von
positionsbasierten Argumenten entgegen, die in einem Tupel args
verpackt sind. Wir können die
Argumente innerhalb der Funktion mit einer for
-Schleife durchlaufen.
Vorteile
- Flexibilität: Ermöglicht es, eine beliebige Anzahl von Argumenten an eine Funktion zu übergeben.
- Vielseitigkeit: Kann für Funktionen mit einer unbestimmten Anzahl von Parametern verwendet werden.
Verwendung von **kwargs
**kwargs
ermöglicht es, eine variable Anzahl von benannten
Argumenten an eine Funktion zu übergeben. Diese Argumente werden in einem Dictionary verpackt und können innerhalb der Funktion bearbeitet werden.
def print_person_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_person_info(name="Alice", age=30, city="New York")
Erklärung
Die Funktion print_person_info
nimmt eine beliebige Anzahl von benannten
Argumenten entgegen, die in einem Dictionary kwargs
verpackt sind. Wir können die Argumente
innerhalb der Funktion mit der Dictionary-Methode items()
durchlaufen.
Vorteile
- Flexibilität: Ermöglicht es, eine beliebige Anzahl von benannten Argumenten an eine Funktion zu übergeben.
- Lesbarkeit: Benannte Argumente machen Funktionsaufrufe lesbarer.
7.2 Festlegen des Argumenttyps
Nur positionsbasierte Argumente
In Python 3.8 und höher kann man Funktionen mit positionsbasierten Argumenten definieren,
die nur positionsbasiert übergeben werden können. Dies wird mit dem
Symbol /
in der Funktionsdefinition durchgeführt.
def greet(name, /, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # Ausgabe: Hello, Alice!
greet("Alice", greeting="Hi") # Ausgabe: Hi, Alice!
# greet(name="Alice") # Fehler: TypeError
Erklärung
Die Funktion greet
nimmt ein Argument name
entgegen, das nur positionsbasiert
übergeben werden kann. Argumente
vor dem /
können nur positionsbasiert übergeben werden.
Dieser Ansatz erlaubt es, die Art und Weise der Argumentübergabe einzuschränken, was die Lesbarkeit verbessert und Fehler vermeidet.
Nur benannte Argumente (Keyword-Only Arguments)
Ebenso kann man Funktionsparameter definieren, die nur
benannt übergeben werden können. Dies wird mit dem Symbol *
in der
Funktionsdefinition durchgeführt.
def greet(*, name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet(name="Alice") # Ausgabe: Hello, Alice!
greet(name="Alice", greeting="Hi") # Ausgabe: Hi, Alice!
# greet("Alice") # Fehler: TypeError
Die Funktion greet
nimmt ein Argument name
entgegen, das nur benannt
übergeben werden kann. Argumente
nach dem *
können nur benannt übergeben werden.
Dieser Ansatz zwingt dazu, die Argumentnamen explizit anzugeben, was die Lesbarkeit des Codes verbessert.
Kombination von positionsbasierten und benannten Argumenten
Man kann auch positionsbasierte und benannte Argumente kombinieren, um maximale Flexibilität zu erreichen.
def greet(name, /, *, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # Ausgabe: Hello, Alice!
greet("Alice", greeting="Hi") # Ausgabe: Hi, Alice!
# greet(name="Alice") # Fehler: TypeError
Die Funktion greet
nimmt ein Argument name
entgegen, das nur positionsbasiert
übergeben werden kann, und ein benanntes Argument greeting
, das zwingend
benannt übergeben werden muss. Die Verwendung von sowohl /
als auch *
ermöglicht die Kombination von positionsbasierten
und benannten Argumenten.
Volles Beispiel für alle drei Szenarien:
def full_example(a, b, /, c, d, *, e, f):
print(f"a={a}, b={b}, c={c}, d={d}, e={e}, f={f}")
# Funktionsaufruf mit verschiedenen Argumenten
full_example(1, 2, 3, 4, e=5, f=6) # Alle Argumente korrekt übergeben
# full_example(a=1, b=2, c=3, d=4, e=5, f=6) # Fehler: TypeError
Erläuterung
-
Nur positionsbasierte Argumente:
a
undb
müssen nur positionsbasiert übergeben werden. -
Gewöhnliche positionsbasierte oder benannte Argumente:
c
undd
können sowohl positionsbasiert als auch benannt übergeben werden. -
Nur benannte Argumente:
e
undf
müssen nur benannt übergeben werden.
GO TO FULL VERSION