225
7.6
Mengen
7.5.4 Verwendung von Generatoren
Bei Programmen, die sehr große Datenmengen verarbeiten, kann man mit Generatoren viel
Speicherplatz sparen. Denn es werden keine Objekte auf Vorrat geschaffen und im Arbeits-
speicher gelagert (wie z.B. bei Listen), sondern »just in time« generiert, wenn man sie wirk-
lich benötigt. Wie Sie schon in einigen Beispielen gesehen haben, kann man Generatoren
so wie Listen bei Iterationen (
for-Schleifen) verwenden. Auch einige Operationen für Kol-
lektionen (
min(), max(), in, not in) können Sie auf Generatoren anwenden. Aber nur ein
Mal! Das rührt daher, dass man die Elemente der Kollektion, die ein Generator repräsentiert,
nur einmal abrufen kann.
Im folgenden Beispiel erzeugen wir einen Generator
zufall für eine Folge von Zufalls-
zahlen. Diese werden in einer
for-Schleife auf den Bildschirm gebracht. Wie man sieht,
kann man den Generator nur einmal benutzen. Bei der zweiten
for-Schleife ist er bereits
»aufgebraucht« und es wird nichts ausgegeben.
Betrachten Sie folgendes Beispiel. Der Generator parabel enthält Funktionswerte einer
quadratischen Funktion für ganze Zahlen von
–10 bis +9.
Warum gibt es beim zweiten Aufruf der
min()-Funktion eine Fehlermeldung? Nun, um das
Minimum zu finden, muss der gesamte Generatorinhalt abgerufen werden. Danach ist er
»leer«.
Generatoren verwendet man gerne, um Mengen zu definieren. Dazu kommen wir im fol-
genden Abschnitt.
7.6 Mengen
Eine Menge ist eine ungeordnete Sammlung von Objekten, wobei jedes Objekt nur einmal
vorkommen darf. In der Mathematik schreibt man Mengen mit geschweiften Klammern
>>> import random
>>> zufall = (random.randint(0, 100) for i in range(10))
>>> for i in zufall: print(i, end= " ") # 1. Verwendung
53 55 0 46 85 88 85 52 20 57
>>> for i in zufall: print(i, end= " ") # 2. Verwendung
>>>
>>> parabel = (x**2 - 2*x + 3 for x in range (-10, 10))
>>> min (parabel)
2
>>> min(parabel)
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
min(parabel)
ValueError: min() arg is an empty sequence
Kapitel 7
Sequenzen, Mengen und Generatoren
226
auf. So ist {2, 3, 5} die Menge mit drei Zahlen 2, 3 und 5. Zur Repräsentation endlicher
Mengen bietet Python zwei Datentypen:
frozenset und set. Was ist der Unterschied?
Objekte vom Typ
frozenset sind (wie Tupel oder Strings) nicht veränderbar. Man kann aus
ihnen keine Elemente entfernen und ihnen keine hinzufügen.
Eine Menge vom Typ
set erzeugen Sie durch Aufruf der Standardfunktion set(). Als Argu-
ment übergeben Sie ein beliebiges iterierbares Objekt (z.B. eine Liste), aus dem dann eine
Menge gebildet wird. Insbesondere werden etwaige Duplikate entfernt.
Alternativ können Sie auch einfach die Elemente in geschweiften Klammern aufzählen.
Duplikate werden automatisch entfernt:
Mengen-Objekte vom Typ
frozenset werden entsprechend mit der Funktion frozenset()
generiert.
Die Beispiele zeigen, wie die Literale aufgebaut sind, die Mengen-Objekte darstellen. Lite-
rale für
set-Objekte sehen aus wie Mengen in der Mathematik: Zwischen geschweiften
Klammern sind die enthaltenen Elemente aufgeführt. Eine leere Menge wird manchmal
vom System mit
set() statt {} angezeigt. Bei frozenset-Objekten steht hinter dem Wort
frozenset in runden Klammern ein Mengen-Literal mit geschweiften Klammern.
Mit Generatorausdrücken kann man Mengen auf abstrakte Weise definieren. Beispiel:
Beachten Sie, dass man nur ein Klammerpaar benötigt. (Streng genommen wird ja ein
Generatorausdruck in runde Klammern geschrieben, so dass der obige Funktionsraufruf
eigentlich zwei Klammerpaare enthalten müsste.)
>>> m1 = set([1, 7, 3, 1, 1]) # Menge von Zahlen
>>> m1
{1, 3, 7}
>>> m2 = set("Barbara") # Menge von Zeichen
>>> m2
{'a', 'r', 'B', 'b'}
>>> a = {1, 1, 2}
>>> a
{1, 2}
>>> m3 = frozenset("Erdbeereis")
>>> m3
frozenset({'b', 'e', 'd', 'i', 's', 'r', 'E'})
>>> q10 = set(i**2 for i in range(10)) # Quadratzahlen
>>> print(q10)
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.