Funktionsargumente
Funktionen akzeptieren Argumente auf verschiedene Art und Weise. Im einfachsten Fall werden die übergebenen Argumente in der gleichen Reihenfolge wie die Argumentnamen in der Signatur zugewiesen:
def subtract(a, b):
return a - b
subtract(1, 2) # -1
Allerdings können die Argument auch benannt übergeben werden, sodass die Reihenfolge nicht mehr berücksichtigt wird, sondern ausschließlich die Namen relevant sind:
subtract(b=2, a=1) # -1
Darüber hinaus können Funktionen einen Standardwert definieren, der verwendet wird, wenn das Argument nicht explizit übergeben wird:
def subtract(a, b=0):
return a - b
subtract(1) # 1
Ist die Anzahl der Argumente nicht bekannt, so können mittels einer speziellen Variable alle nicht namentlich bekannten Argument in einem Tupel zusammengefasst werden. Das gelingt durch einen dem Argumentnamen vorangestellten Asterisk *
:
def add(*args):
total = 0
for a in args:
total += a
return total
add(1, 2, 3) # 6
Alle explizit benannten Argumente lassen sich in einem Dictionary zusammenfassen. Dazu wird ein doppelter Asterisk **
verwendet:
def collect_arguments(**kwargs):
return kwargs
collect_arguments(a=1, b=2) # {'a': 1, 'b': 2}
Hat man bereits ein Tupel oder ein Dictionary, so können die mit der gleichen Syntax auch in einzelne Argumente konvertiert werden:
def add(a, b):
return a + b
values = (1, 2)
add(*values) # 3
values = {'a': 1, 'b': 2}
add(**values) # 3
Type Hints
In Python werden die Datentypen von Variablen nicht strikt geprüft. Damit man anderen Entwicklern oder aber sich selbst in einiger Zukunft Hilfe darin leisten kann, zu verstehen, welche Argumente eine Funktion annimmt und zurückgibt, können type hints verwendet werden. Das ist für eigenen Code natürlich optional, wird aber in den Übungsaufgaben verwendet um klarzustellen, welche Art von Argumenten erwartet werden. Dabei wird der Datentyp durch einen Doppelpunkt :
getrennt hinter den Variablennamen in der Funktionssignatur geschrieben:
def add(a: int, b: int) -> int:
return a + b
Das bedeutet, dass die Funktion zwei Variablen a
und b
als Ganzzahlen entgegennimmt und eine Ganzzahl zurückgibt. Soll stattdessen eine Liste übergeben werden, würde man folgendes schreiben:
def list_total(values: list[int]) -> int:
total = 0
for v in values:
total += v
return total
Hier nimmt die Funktion eine Liste von Ganzzahlen an und gibt die Summe als Ganzzahl zurück. Da man sich jedoch auch einfach über die Hinweise hinwegsetzen kann, ist auch sofort klar, dass die Funktion auch mit Dezimalzahlen umgehen könnte, auch wenn die type hints davon erstmal nichts sagen.