Funktoren auf Iterable verteilen (Funktoren auf Iterable verteilen), lesson, Seite 724584
https://www.purl.org/stefan_ram/pub/verteilen_python (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Python-Kurs

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

 

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 stefanram724584 stefan_ram:724584 Funktoren auf Iterable verteilen Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd724584, slrprddef724584, 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/verteilen_python