Verschachtelungen: Der if-Ausdruck in Funktionsdefinitionen in Python (Verschachtelungen: Der if-Ausdruck in Funktionsdefinitionen in Python), Lektion, Seite 724086
https://www.purl.org/stefan_ram/pub/if-ausdruck_funktionsdefinitionen_python (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Python-Kurs

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 )* sonst

def 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 random

def 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.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram724086 stefan_ram:724086 Verschachtelungen: Der if-Ausdruck in Funktionsdefinitionen in Python Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd724086, slrprddef724086, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/if-ausdruck_funktionsdefinitionen_python