Funktoren auf Objekte aus einem Iterablen anwenden
- Konsolenprotokoll
tuple( map( ord, "abc" ))
(97, 98, 99)
- Konsolenprotokoll
tuple( map( lambda s: "(" + s + ")", ( "Hans", "Lotte", "Liesl" ) ))
('(Hans)', '(Lotte)', '(Liesl)')
- Konsolenprotokoll
tuple( range( 9 ))
(0, 1, 2, 3, 4, 5, 6, 7, 8)
- Konsolenprotokoll
from math import factorial
tuple( map( factorial, range( 9 )))
(1, 1, 2, 6, 24, 120, 720, 5040, 40320)
Die von ›range(3)‹ gelieferten Objekte haben den falschen Typ für ›join‹.
- Konsolenprotokoll
", ".join( range( 3 ))
TypeError: sequence item 0: expected str instance, int found
Der Funktor ›str‹ wird in dem folgenden Beispiel zwar auf das Bereichsobjekt angewendet, aber nicht auf dessen einzelne Werte.
- Konsolenprotokoll
", ".join( str( range( 3 )))
'r, a, n, g, e, (, 0, ,, , 3, )'
Der Funktor ›map‹ erzeugt ein neues Iterables, welches das Ergebnis der Anwendung seines ersten Arguments auf die Werte des zweiten Arguments beschreibt. So kann der Funktor ›str‹ also tatsächlich auf die einzelnen Werte angewendet werden.
- Konsolenprotokoll
", ".join( map( str, range( 3 )))
'0, 1, 2'
- Konsolenprotokoll
print( _ )
0, 1, 2
Anmerkung Iterable beschreiben zunächst die Ermittlung bestimmter Werte, ohne diese alle schon abzuspeichern. Es sind also praktisch Programme. Das folgende Beispiel zeigt, daß die Werte erst bei Bedarf erzeugt werden.
- Konsolenprotokoll
f = lambda x: print( "f" )
l = map( f, range( 3 ))
i = iter( l )
next( i )
f
next( i )
f
next( i )
f
next( i )
StopIteration
Daher kann ›map‹ auch auf unendliche Iterable angewendet werden.
- Konsolenprotokoll
import itertools
numbers = itertools.count()
import math
factorials = map( math.factorial, numbers )
i = iter( factorials )
next( i )
1
next( i )
1
next( i )
2
next( i )
6
next( i )
24
next( i )
120
next( i )
720
Iteratoren
›map‹ liefert einen Iterator, dessen Werte beim Auslesen „verbraucht“ werden.
- Konsolenprotokoll
i = map( ord, "abc" )
tuple( i )
(97, 98, 99)
tuple( i )
()
Deswegen sind besondere Maßnahmen nötig, wenn die gelieferten Werte mehrfach verwendet werden soll. Beispielsweise können sie in ein Tupel kopiert werden, wenn es nicht zu viele Werte sind.
- Konsolenprotokoll
i = tuple( map( ord, "abc" ))
tuple( i )
(97, 98, 99)
tuple( i )
(97, 98, 99)
Übungsaufgaben
Bei allen Aufgaben in diesem Kurs darf eine Lösung auch aus einer Abfolge mehrere Zeilen bestehen, in denen auch weitere Hilfsfunktionen definiert werden dürfen, die später verwendet werden dürfen, falls in einer Aufgabenstellung nichts gegenseitiges gesagt wird.
/ Übungsaufgabe
Schreiben Sie eine Funktion »f«, die eine Zahl akzeptiert und eine mit », « getrennte Liste (vom Typ ›str‹, nicht ›list‹) aller Zahlen bis zu dieser Zahl (ausschließlich) ergibt.
- Beispiel
f( 5 )
'0, 1, 2, 3, 4'
- Beispiel
f( 2 )
'0, 1'
- Test
t = lambda: f( 0 )=='' and f( 1 )=='0' and f( 2 )=='0, 1' and f( 3 )=='0, 1, 2' and type( f( 3 ))= str
t()
True
/ Liste der Zeichen
Schreiben Sie einen range-Ausdruck für den Bereich der Zahlen von 32 (einschließlich) bis 126 (einschließlich).
/ Liste der Zeichen 1
Schreiben Sie einen map-Ausdruck für die Zeichen mit den Kennzahlen von 32 (einschließlich) bis 126 (einschließlich).
- Darstellung des Ergebnisses des map-Ausdrucks mit Hilfe von ›tuple‹ (gekürzt)
- (' ', '!', '"', '#', … , '}', '~')
/ Liste der Zeichen 2
Verketten Sie alle Werte des map-Ausdrucks der vorigen Aufgabe zu einer einzigen Zeichenfolge und erstellen Sie so ein str-Objekt mit den druckbaren Zeichen des ASCII-Codes.
- gewünschter Wert
' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
- Ausgabe des gewünschten Wertes mit ›print‹
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
/ Vokalzählung, M, 10′
Schreiben Sie eine Funktion »v«, welche die Anzahl der Vokale (= eines der Schriftzeichen »a«, »e«, »i«, »o« und »u«) ergibt.
- Beispiel
v( "Vokal" )
2
- Test
t = lambda: v( "" )== 0 and v( "bcd" )== 0 and v( "abc" )==1 and v( "Vokal" )==2 and v( "aeiouae" )== 7
t()
True
/ Übungsaufgabe 2 ↚
Schreiben Sie eine Funktion, die zwei Zeichen akzeptiert und die Folge aller Zeichen vom ersten angegebenen Zeichen (einschließlich) bis zum zweiten angegebenen Zeichen (ausschließlich) ergibt.
- Beispiel
f( 'a', 'f' )
'abcde'
- Test
t = lambda f: f( 'a', 'a' )=='' and f( 'a', 'b' )=='a' and f( 'b', 'd' )=='bc' and f( 'a', 'f' )=='abcde'
t( f )
True
/ Übungsaufgabe 3 ↚
Schreiben Sie eine Funktion, die zwei Zeichen akzeptiert und die Folge aller Zeichen vom ersten angegebenen Zeichen (einschließlich) bis zum zweiten angegebenen Zeichen (ausschließlich) ergibt. Dabei soll jedes Zeichen zusammen mit seiner Kennzahl auf einer eigenen Zeile stehen.
- Beispiel
f( 'a', 'j' )
a 97
b 98
c 99
d 100
e 101
f 102
g 103
h 104
i 105- Test
t = lambda f: f( 'a', 'a' )=='' and( f( 'a', 'b' )=='a 97' or f( 'a', 'b' )=='a 97' )and( f( 'c', 'e' )=='c 99\nd 100' or f( 'c', 'd' )=='c 99\nd 100' )
t( f )
True
Es ist nicht unbedingt nötig, die Ausgabe so zu formatieren, daß die Zahl rechtsbündig ausgerichtet ist.
/ Übungsaufgabe 4 ↚
Schreiben Sie eine Funktion ›rot12‹, die alle Buchstaben eines Wortes aus den 26 Buchstaben von »a« bis »x« mit R12 verschlüsselt.
- Beispiel
rot12( 'beispiel' )
'nqugduqx'
- Test
t = lambda: rot12( 'beispiel' )=='nqugduqx' and rot12( 'nqugduqx' )== 'beispiel'
/ Übungsaufgabe 5 ↚
Schreiben Sie eine Funktion, die alle Vorkommen eines Textes in einer Zeichenfolge durch einen anderen Text ersetzt.
- Beispiel
replace( 'Teilnehmer können andere Teilnehmer sehen.', 'Teilnehmer', 'Teilnehmer*innen' )
'Teilnehmer*innen können andere Teilnehmer*innen sehen.'
- Test
t = lambda: replace( 'beispiel', 'i', 'e' )=='beespeel'
/ TickTack ↚
Schreiben Sie einen Ausdruck, dessen Auswertung die Zahlen von 1 (einschließlich) bis 100 (einschließlich) ausgibt.
Falls eine Zahl durch 3 teilbar ist, soll aber an Stelle der Zahl das Wort „Tick“ erscheinen.
Falls eine Zahl durch 5 teilbar ist, soll an Stelle der Zahl das Wort „Tack“ erscheinen.
Falls eine Zahl durch 3 und 5 teilbar ist, soll an Stelle der Zahl „TickTack“ erscheinen.
- gewünschte Ausgabe
1
2
Tick
4
Tack
Tick
7
8
Tick
Tack
11
Tick
13
14
TickTack
16
17
Tick
19
Tack
Tick
22
23
Tick
Tack
26
Tick
28
29
TickTack
31
32
Tick
34
Tack
Tick
37
38
Tick
Tack
41
Tick
43
44
TickTack
46
47
Tick
49
Tack
Tick
52
53
Tick
Tack
56
Tick
58
59
TickTack
61
62
Tick
64
Tack
Tick
67
68
Tick
Tack
71
Tick
73
74
TickTack
76
77
Tick
79
Tack
Tick
82
83
Tick
Tack
86
Tick
88
89
TickTack
91
92
Tick
94
Tack
Tick
97
98
Tick
Tack