Verschachtelungen: Der if-Ausdruck in Funktionsdefinitionen in Python
Wir könnnen mit dem if-Ausdruck nun beispielsweise eine Funktion definieren, welche die Zeichenfolge »Null« für den Argumentwert »0« liefert und sonst die Zeichenfolge »nicht-Null«.
- Funktionsdefinition
def f( x ):
return( '' if x == 0 else 'nicht-' )+ 'Null'- Protokoll
f( 0 )
'Null'
- Protokoll
f( 1 )
'nicht-Null'
»f« ist eine Wertfunktion. Es ist möglich, auf »f« aufbauend eine Wirkfunktion »u« definieren, welche die Klassifikation einer Zahl als Satz ausgibt.
- Funktionsdefinition
def u( x ):
print( str( x )+ ' ist ' + f( x ) )- Protokoll
u( 0 )
0 ist Null.
- Protokoll
u( 1 )
1 ist nicht-Null.
- Protokoll
u( 2 )
2 ist nicht-Null.
Kehrwert
Der Kehrwert einer Zahl ist der Quotient aus der Zahl »1« als Dividenden und jener Zahl als Divisor.
- Funktionsdefinition
def k( x ):
return 1 / x- Auswertung
k( 1 )
1.0
Man darf aber nicht durch 0 teilen.
- Protokoll (frei übersetzt und gekürzt)
k( 0 )
Nulldivisionsfehler: Versuch der Division durch 0
Um eine Fehlermeldung zu verhindern, können wir einen if-Ausdruck einsetzen.
- Funktionsdefinition
k = lambda x: 1 / x if x != 0 else None
- Alternative Funktionsdefinition (besserer Stil als die Bindung von lambda-Funktionen an einen gewöhnlichen Bezeichner)
def k( x ):
return 1 / x if x != 0 else None- Protokoll
k( 1 )
1.0
- Protokoll
k( 0 )
Das folgende Gegenbeispiel zeigt, wie ein selbstgebastelter if-Ausdruck bei der Absicherung gegen eine Fehlermeldung versagt, weil die Argumente von Funktionsaufrufen immer ausgewertet werden.
- Eingaben
def wenn( wenn, dann, sonst ):
return wenn * dann +( 1 - wenn )* sonstdef k( x ):
return wenn( x != 0, 1 / x, 0 )k( 1 )
1.0
k( 0 )
ZeroDivisionError: division by zero
Anwendungsbeispiel
Im folgenden Programm wurden Interpolationsausdrücke durch if-Ausdrücke ersetzt.
- Interpolationsausdruck
ist_quinte * quintverhaeltnis +( 1-ist_quinte )* terzverhaeltnis
- If-Ausdruck
quintverhaeltnis if ist_quinte else terzverhaeltnis
Der if-Ausdruck ist nicht nur etwas kürzer, sondern auch besser verständlich, da sein Zweck bekanntermaßen die Wahl zwischen zwei Ausdrücken ist, während der Zweck des Interpolationsausdrucks weniger allgemein bekannt und verständlich ist.
main.py
from winsound import Beep
from random import randomdef beep( ist_quinte ):
quintverhaeltnis = 3/2
terzverhaeltnis = 5/4
frequenzverhaeltnis = quintverhaeltnis if ist_quinte else terzverhaeltnis
erste_frequenz_in_Hz = int( random() * 1000 + 110 )
zweite_frequenz_in_Hz = int( erste_frequenz_in_Hz * frequenzverhaeltnis )
dauer_in_millisekunden = 400
Beep( erste_frequenz_in_Hz, dauer_in_millisekunden )
Beep( zweite_frequenz_in_Hz, dauer_in_millisekunden )def dialog( ist_quinte ):
isteingabe = input( "War dies eine Quinte (q) oder eine grosse Terz (t)? " )
print( 'Es war eine', 'Quinte.' if ist_quinte else 'Terz.' )
solleingabe = 'q' if ist_quinte else 't'
ist_richtig = isteingabe == solleingabe
print( 'Ihre Antwort war', 'richtig.' if ist_richtig else 'falsch.' )ist_quinte = 0 if random() < 0.5 else 1 # 1 = Quinte, 0 = keine Quinte (also eine Terz)
beep( ist_quinte )
dialog( ist_quinte )
Anwendungsbeispiel 1
main.py
from turtle import *
from winsound import Beep
speed( False )def Right():
"""Bewegung nach vorne und rechts"""
Beep( 1000, 100 )
forward( 50 )
right( 60 )
def Left():
"""Bewegung nach vorne und links"""
Beep( 2000, 100 )
forward( 50 )
left( 60 )
def b():
"""Beginn eines Fuellvorgangs"""
Beep( 1000, 100 )
begin_fill()
def e():
"""Ende eines Fuellvorgangs"""
Beep( 2000, 100 )
end_fill()
def h():
"""Ausgabe von "hello!" """
Beep( 1000, 100 )
print('hello!')
def s():
"""Einlesen der Fuellfarbe """
Beep( 2000, 100 )
r = numinput( '', 'red (0-10)' )
g = numinput( '', 'green (0-10)' )
b = numinput( '', 'blue (0-10)' )
listen()
fillcolor( r/10, g/10, b/10 )size = 1
def plus():
Beep( 2000, 100 )
global size
size += 1
pensize( size )def minus():
Beep( 1000, 100 )
global size
size -= 1 if size else 0
pensize( size )onkey( Right, 'Right' )
onkey( Left, 'Left' )
onkey( b, 'b' )
onkey( e, 'e' )
onkey( s, 's' )
onkey( h, 'h' )
onkey( plus, 'plus' )
onkey( minus, 'minus' )
onkey( lambda: Beep( 200, 100 ), ' ' )
listen()mainloop() # Unter manchen Python-Implementationen noetig
Übungsfragen
? Übungsfrage 0
Was ist die Ausgabe des folgenden Programms?
main.py
def f():
print( 0 )
if False:
print( 1 )
print( 2 )
f()
? Übungsfrage 1
Was ist die Ausgabe des folgenden Programms?
Dieses Programm unterscheidet sich vom vorigen Programm nur durch die Einrückung der Anweisung »print( 2 )«.
main.py
def f():
print( 0 )
if False:
print( 1 )
print( 2 )
f()
? Übungsfrage 2
Was ist die Ausgabe des folgenden Programms?
Dieses Programm unterscheidet sich vom vorigen Programm nur durch die Einrückung der Anweisung »print( 2 )«.
main.py
def f():
print( 0 )
if False:
print( 1 )
print( 2 )
f()
? Übungsfrage 3
Was ist die Ausgabe des folgenden Programms?
main.py
def f( i ):
print( i )
f( i - 1 ) if i else None
print( i )f( 0 )
? Übungsfrage 4
Was ist die Ausgabe des folgenden Programms?
main.py
def f( i ):
print( i )
f( i - 1 ) if i else None
print( i )f( 1 )
Übungsaufgaben
/ Übungsaufgabe 0
Schreiben Sie eine Funktion, die eine ganze Zahl vom Typ »int« als Argument akzeptiert. Man kann sich vorstellen, daß diese Zahl das Alter einer Person in Jahren angeben soll.
Wenn die übergebene Zahl nicht-negativ ist, soll die Zeichenfolge »akzeptabel« vom Typ »str« zurückgegeben werden.
Sonst soll die Zeichenfolge »nicht-akzeptabel« vom Typ »str« zurückgegeben werden.
/ Übungsaufgabe 1
Schreiben Sie eine Funktion, die den Bediener nach seinem Alter fragt.
Wenn die eingegebene Zahl nicht-negativ ist, soll ausgegeben werden: »akzeptabel«.
Sonst soll ausgegeben werden: »nicht-kzeptabel«.
(Es darf hierbei davon ausgegangen werden, daß der Bediener stets ein Numerale eingibt, das aus einem optionalem Minuszeichen »-« und Ziffern besteht.)
/ Übungsaufgabe 2
Schreiben Sie eine Definition einer Funktion, die das Maximum ihrer beiden ganzzahligen Argumentwerte berechnet, ohne dabei eine andere Funktion aufzurufen. (Bei dieser Übungsaufgabe darf ausnahmsweise auch keine Funktion aus einer Bibliothek aufgerufen werden.)
- Das Maximum zweier Zahlenangaben (Werte), die zwei unterschiedliche Zahlen angeben, ist die größere der beiden Zahlen. Das Maximum zweier Zahlenangaben (Werte), die beide dieselbe Zahl angeben, ist eben jene Zahl.