Default- oder Keyword-Argumente

Wir haben bisher nur Funktionen mit einem einzigen Argument kennengelernt. Wir können aber natürlich auch Funktionen mit mehreren Argumenten und insbesondere mit voreingestellten (default) Argumenten, die auch Schlüsselwort-Argumente (Keyword-Argumente) heissen, definieren. Voreingestellte Argumente werden wie eine Zuweisung in die Argumentenliste eingefügt, allerdings müssen die voreingestellten Argumente nach allen zwingend erforderlichen (mandatory) Argumenten stehen.

In dem folgenden Beispiel wird eine Funktion frage erstellt, die eine Eingabe eines Benutzers über die eingebaute Funktion (builtin function) input verlangt. Als zwingend erforderliches Argument wird die Variable frage erwartet, die weiteren Argumente wiederholung und nachfrage sind als voreingestellte (default) Argumente optionale Argumente und mit den Werten 4 für die Anzahl der Wiederholungen und mit dem String Bitte nochmal! für die Nachfrage.

In [2]:
def frage(frage, wiederholung=4, nachfrage='Bitte nochmal!'):
    while True:
        ok = input(frage)
        if ok in ('j', 'ja', 'J', 'Ja'):
            return True
        if ok in ('n', 'ne', 'nei', 'nein', 'N', 'Ne,','Nei','Nein'):
            return False
        wiederholung = wiederholung - 1
        if wiederholung < 0:
            raise ValueError('ungültige Benutzereingabe')
        print(nachfrage)
In [3]:
frage("Wollen sie die Datei wirklich löschen? ")
Wollen sie die Datei wirklich löschen? keine Ahnung
Bitte nochmal!
Wollen sie die Datei wirklich löschen? nein
Out[3]:
False

Festlegung der voreingestellten Argumente

Die voreingestellten Werte werden zu dem Zeitpunkt berechnet und für die Funktion festgelegt, wenn die Funktion definiert wird:

In [4]:
i = 5
def f(arg=i):
    print(arg)
i = 6
f()
5

Daraus folgt auch, dass eine Liste oder andere veränderbare Objekte als Argumente entsprechend differenziert betrachtet werden müssen. Im folgenden Beispiel wird die leere Liste L nur bei der Definition der Funktion festgelegt, sodass diese Liste bei jedem Funktionsaufruf erweitert wird.

In [5]:
def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))
[1]
[1, 2]
[1, 2, 3]

Will man dagegen bei jedem Funktionsaufruf eine neue leere Liste anlegen, so muss dies innerhalb der Funktion durchgeführt werden:

In [6]:
def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))
[1]
[2]
[3]

Beispiel aus dem Mathematik Modul

Es ist folgende Funktion quadr mit dem zwingend erforderlichen Argument x und den optionalen Argumenten a,b und c zur Definition und Erstellung einer quadratischen Funktion gegeben:

In [7]:
def quadr(x,a=1,b=0,c=0):
    return a*x**2+b*x+c 

In der folgenden Liste werden 7 weitere Listen aus jeweils 3 Werten für a,b,c als Parameter für jeweils eine quadratische Funktion erstellt:

In [8]:
abc = [[1,2,3],
       [-2,2,2],
       [2,0,2],
       [-1,-1,0],
       [0,1,0],
       [0,-1,-2],
       [0,0,2]]

Wie in dem vorhergehenden Unterkapitel können die entsprechenden Funktionen grafisch dargestellt werden:

In [9]:
from pygal import XY
from IPython.display import SVG
xy = XY()
for funktion in abc:
    tabelle = []
    for x in range(-4,5):
        tabelle.append((x,quadr(x,args[0],args[1],args[2])))
    xy.add("Funktion "+str(abc.index(args)+1), tabelle)
SVG(xy.render())
Out[9]:
Pygal-30-30-20-20-10-1000101020203030-4-4-3-3-2-2-1-10011223344-4: 1112.038461538461547176.25-3: 687.27884615384616212.30769230769232-2: 3162.51923076923077233.94230769230768-1: 2237.7596153846154241.153846153846130: 3313.0233.942307692307681: 6388.24038461538464212.307692307692322: 11463.4807692307692176.253: 18538.7211538461538125.769230769230774: 27613.961538461538560.865384615384585-4: -3812.038461538461547529.6153846153846-3: -2287.27884615384616414.2307692307692-2: -10162.51923076923077327.69230769230774-1: -2237.7596153846154270.00: 2313.0241.153846153846131: 2388.24038461538464241.153846153846132: -2463.4807692307692270.03: -10538.7211538461538327.692307692307744: -22613.9615384615385414.2307692307692-4: 3412.03846153846154710.384615384615358-3: 2087.27884615384616111.34615384615381-2: 10162.51923076923077183.46153846153845-1: 4237.7596153846154226.730769230769230: 2313.0241.153846153846131: 4388.24038461538464226.730769230769232: 10463.4807692307692183.461538461538453: 20538.7211538461538111.346153846153814: 34613.961538461538510.384615384615358-4: -1212.038461538461547342.11538461538464-3: -687.27884615384616298.8461538461538-2: -2162.51923076923077270.0-1: 0237.7596153846154255.57692307692310: 0313.0255.57692307692311: -2388.24038461538464270.02: -6463.4807692307692298.84615384615383: -12538.7211538461538342.115384615384644: -20613.9615384615385399.8076923076923-4: -412.038461538461547284.4230769230769-3: -387.27884615384616277.21153846153845-2: -2162.51923076923077270.0-1: -1237.7596153846154262.788461538461550: 0313.0255.57692307692311: 1388.24038461538464248.365384615384642: 2463.4807692307692241.153846153846133: 3538.7211538461538233.942307692307684: 4613.9615384615385226.73076923076923-4: 212.038461538461547241.15384615384613-3: 187.27884615384616248.36538461538464-2: 0162.51923076923077255.5769230769231-1: -1237.7596153846154262.788461538461550: -2313.0270.01: -3388.24038461538464277.211538461538452: -4463.4807692307692284.42307692307693: -5538.7211538461538291.634615384615364: -6613.9615384615385298.8461538461538-4: 212.038461538461547241.15384615384613-3: 287.27884615384616241.15384615384613-2: 2162.51923076923077241.15384615384613-1: 2237.7596153846154241.153846153846130: 2313.0241.153846153846131: 2388.24038461538464241.153846153846132: 2463.4807692307692241.153846153846133: 2538.7211538461538241.153846153846134: 2613.9615384615385241.15384615384613Funktion 1Funktion 2Funktion 3Funktion 4Funktion 5Funktion 6Funktion 7
In [10]:
%%Mooc MultipleChoiceAssessment
Out[10]:

Funktionen mit mehreren Argumenten

Es ist folgende Funktion mit dem zwingend erforderlichen Argument x und den optionalen Argumenten a,b und c zur Definition und Erstellung einer quadratischen Funktion gegeben:


def quadr(x,a=1,b=0,c=0):
    return a*x**2+b*x+c

Welcher Funktionsaufruf ergibt eine ansteigende Gerade ?

quadr(x,1,2,3)
quadr(x,-2,2,2)
quadr(x,2,0,2)
quadr(x,-1,-1)
quadr(x,0,1)
quadr(x,0,-1,-2)
quadr(x,0,0,2)

Position der voreingestellten Argumente

In dem folgenden Beispiel werden die allgemeinen Parameter einer quadratischen Funktion als voreingestellte (default) Argumente nach dem zwingend erforderlichen Argument x in der Definition der Funktion angegeben. Beim Aufruf der Funktion sehen sie, dass die Position der Default-Argumente keine Rolle spielt, solange das entsprechende Schlüsselwort mit übergeben wird.

In [11]:
%%Mooc MultipleChoiceAssessment
Out[11]:

Position der Defaultargumente

Es ist folgender Code vorgegeben:


def quadr(x,a=1,b=0,c=0):
    return a*x**2+b*x+c
quadr(2,c=4,b=2)

Wenn als Ergebnis 12 angezeigt wird, welche der Funktionsaufrufe ist falsch ?

quadr(2,c=4,b=2)
quadr(1,b=4,c=6,a=2)
quadr(2,3,c=1)
quadr(3,c=3)
quadr(4,b=3,a=0)
quadr(2,2,2)

In [12]:
%%Mooc Video
Out[12]:

Rückgabewerte

Funktion als Rückgabewert

Sowohl als Argumente als auch als Rückgabewerte können in einer Funktion die unterschiedlichsten Objekte verwendet werden, u.a. macht es für die obige Aufgabenstellung der Erstellung einer quadratischen Funktion Sinn eine Funktion zu erstellen, deren Rückgabewert wieder eine Funktion ist:

In [13]:
def quadr(a=1,b=0,c=0):
    def f(x):
        return a*x**2+b*x+c
    return f
In [14]:
functions = [quadr(2,4,6),
             quadr(4,0,6),
             quadr(0,5),
             quadr(-3,2,1),
             quadr(0,-3,-3),
             quadr(-2,-1),
             quadr(0,0,6)]
In [15]:
%%Mooc MultipleChoiceAssessment
Out[15]:

Funktionen mit mehreren Argumenten

Es ist folgende Funktion mit den Argumenten a,b und c zur Definition und Erstellung einer quadratischen Funktion gegeben:


def quadr(a=1,b=0,c=0):
    def f(x):
        return a*x**2+b*x+c
    return f

Testen sie die entsprechenden Funktionsaufrufe auch grafisch mit einem ähnlichen Code wie oben (Verwenden sie eine Schleife über alle Funktionen)!

Welcher Funktionsaufruf ergibt eine ansteigende Gerade ?

quadr(2,4,6)
quadr(4,0,6)
quadr(0,5)
quadr(-3,2,1)
quadr(0,-3,-3)
quadr(-2,-1)
quadr(0,0,6)

Funktionen ohne Rückgabewert

In der folgenden Funktion ist der Default-Wert für das Argument arg der String "Es wurde kein Argument übergeben". Die Funktion selbst besteht nur aus dem einzigen Ausdruck print(arg) - es ist kein return-Ausdruck vorhanden. Dennoch wird ein Wert übergeben, nämlich None.

In [16]:
def f(arg="Es wurde kein Argument übergeben"):
    print(arg)
x=f()
print(x)
Es wurde kein Argument übergeben
None

Lambda Funktion

Normalerweise werden Funktionen immer mit einem Namen definiert um mit diesem Namen dann auch aufgerufen werden zu können. Wenn jedoch die Funktion klein ist, ist manchmal der Aufwand für die Abspeicherung des Namens der Funktion zu groß und eventuell auch nicht notwendig. Für solche kleinen Funktionen gibt es in Python das Konstrukt der Lambda Funktion. Der folgende Code addiert einfach die beiden Argumente a und b:

In [17]:
f = lambda a,b: a+b
f(2,3)
Out[17]:
5

Lambda Funktionen können überall dort verwendet werden, wo immer auch normale Funktionen erforderlich sind. Syntaktisch sind Lambda Funktionen eingeschränkt auf einfache Ausdrücke, also z.B. keine mehrzeiligen Ausdrücke. Ein typisches Beispiel für die Verwendung der Lambda Funktion ist eine alternative - auf zwei Zeilen reduzierte - Version der obigen Funktion quadr für eine quadratische Gleichung:

In [18]:
def quadr(a=1,b=0,c=0):
    return lambda x: a*x**2+b*x+c

Das Beispiel von oben lautet dann:

In [19]:
f = quadr(c=4,b=2)
f(2)
Out[19]:
12
In [20]:
%%Mooc Video
Out[20]:

Weitere Literatur

In [21]:
%%Mooc WebReference

Defining Functions

https://docs.python.org/3/tutorial/controlflow.html#defining-functions

Hinweis: Das in Funktionen einführende Kapitel des offiziellen Python Tutorials