Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by haas.homelinux.net...

Inhaltsverzeichnis
1 Einleitung
2 Überblick über Python
3 Die Arbeit mit Python
4 Der interaktive Modus
5 Grundlegendes zu Python-Programmen
6 Kontrollstrukturen
7 Das Laufzeitmodell
8 Basisdatentypen
9 Benutzerinteraktion und Dateizugriff
10 Funktionen
11 Modularisierung
12 Objektorientierung
13 Weitere Spracheigenschaften
14 Mathematik
15 Strings
16 Datum und Zeit
17 Schnittstelle zum Betriebssystem
18 Parallele Programmierung
19 Datenspeicherung
20 Netzwerkkommunikation
21 Debugging
22 Distribution von Python-Projekten
23 Optimierung
24 Grafische Benutzeroberflächen
25 Python als serverseitige Programmiersprache im WWW mit Django
26 Anbindung an andere Programmiersprachen
27 Insiderwissen
28 Zukunft von Python
A Anhang
Stichwort

Download:
- ZIP, ca. 4,8 MB
Buch bestellen
Ihre Meinung?

Spacer
 <<   zurück
Python von Peter Kaiser, Johannes Ernesti
Das umfassende Handbuch - Aktuell zu Python 2.5
Buch: Python

Python
gebunden, mit CD
819 S., 39,90 Euro
Galileo Computing
ISBN 978-3-8362-1110-9
Pfeil 8 Basisdatentypen
  Pfeil 8.1 Operatoren
  Pfeil 8.2 Das Nichts – NoneType
  Pfeil 8.3 Numerische Datentypen
    Pfeil 8.3.1 Ganze Zahlen – int, long
    Pfeil 8.3.2 Gleitkommazahlen – float
    Pfeil 8.3.3 Boolesche Werte – bool
    Pfeil 8.3.4 Komplexe Zahlen – complex
  Pfeil 8.4 Methoden und Parameter
  Pfeil 8.5 Sequenzielle Datentypen
    Pfeil 8.5.1 Listen – list
    Pfeil 8.5.2 Unveränderliche Listen – tuple
    Pfeil 8.5.3 Strings – str, unicode
  Pfeil 8.6 Mappings
    Pfeil 8.6.1 Dictionary – dict
  Pfeil 8.7 Mengen
    Pfeil 8.7.1 Mengen – set
    Pfeil 8.7.2 Unveränderliche Mengen – frozenset


Galileo Computing - Zum Seitenanfang

8.7 Mengen  Zur nächsten ÜberschriftZur vorigen Überschrift

Eine Menge (engl. set) ist eine ungeordnete Ansammlung von Elementen. Jedes Element kann sich dabei nur einmal in der Menge befinden. In Python gibt es zur Darstellung von Mengen zwei Basisdatentypen: set für eine veränderliche Menge sowie frozenset für eine unveränderliche Menge: set ist demnach mutable, frozenset immutable.

Eine leere Instanz der Datentypen set und frozenset wird folgendermaßen erzeugt:

s = set() 
fs = frozenset()

Wenn die Menge bereits zum Zeitpunkt der Instanziierung Elemente enthalten soll, so muss ein iterierbares Objekt als Parameter übergeben werden, das alle gewünschten Elemente enthält, in diesem Fall zum Beispiel eine Liste:

>>> set([1,2,3,99,-7]) 
set([99, 1, 2, 3, -7])

Wir werden hier stets Listen verwenden, da ihre Verwendung am einfachsten zu durchschauen ist. Tupel, Strings, Dictionarys oder gar Mengen selbst funktionieren zur Initialisierung eines Sets oder Frozensets problemlos. Im Falle eines Strings wird das set aus allen Buchstaben und im Falle eines Dictionarys aus allen Schlüsseln zusammengesetzt. Da in einer Menge kein Element mehrfach vorkommen darf, werden Dubletten herausgefiltert. Es kommt deswegen jedoch nicht zu einem Fehler.

>>> set("Python") 
set(['h', 'o', 'n', 'P', 't', 'y']) 
>>> frozenset({0:"a", 1:"b", 2:"c"}) 
frozenset([0, 1, 2])

An diesem Beispiel ist sehr schön zu sehen, dass die Reihenfolge der in einem set enthaltenen Werte willkürlich ist. Beachten Sie, dass sie dennoch nicht zufällig ist, sondern von bestimmten interpreterspezifischen Faktoren abhängt.

Mithilfe der Methode values eines Dictionarys lassen sich auch die Werte ins Set übertragen:

>>> d = ({0 : "a", 1 : "b", 2 : "c"}) 
>>> set(d.values()) 
set(['a', 'c', 'b'])

Bei einer Menge handelt es sich um ein iterierbares Objekt, das problemlos in einer for-Schleife durchlaufen werden kann. Dazu folgendes Beispiel:

menge = set([1, 100, "a", 0.5]) 
for element in menge: 
    print element

Dieser Code würde folgende Ausgabe erzeugen:

a 
1 
100 
0.5

Operatoren

Die Datentypen set und frozenset verfügen über eine gemeinsame Schnittstelle, die im Folgenden näher erläutert werden soll. Wir möchten damit beginnen, alle gemeinsamen Operatoren zu behandeln. Der Einfachheit halber werden wir uns bei der Beschreibung der Operatoren ausschließlich auf den Datentyp set beziehen. Dennoch können sie und auch die Methoden, die später beschrieben werden, für frozenset genauso verwendet werden. [Eine Menge T wird »echte Teilmenge« einer zweiten Menge M genannt, wenn T Teilmenge von M ist und weniger Elemente als M enthält. ]


Tabelle 8.28  Operatoren der Datentypen set und frozenset
Operator Beschreibung

len(s)

Liefert die Anzahl aller im Set s enthaltenen Elemente.

x in s

True, wenn x im Set s enthalten ist, andernfalls False.

x not in s

True, wenn x nicht im Set s enthalten ist. Andernfalls False.

s <= t

True, wenn es sich bei der Menge s um eine Teilmenge der Menge t handelt, andernfalls False.

s < t

True, wenn es sich bei der Menge s um eine echte Teilmenge11 der Menge t handelt, andernfalls False.

s >= t

True, wenn es sich bei der Menge t um eine Teilmenge der Menge s handelt, andernfalls False.

s > t

True, wenn es sich bei der Menge t um eine echte Teilmenge der Menge s handelt, andernfalls False.

s | t

Erzeugt ein neues Set, das alle Elemente von s und t enthält.

Diese Operation bildet also die Vereinigungsmenge zweier Mengen.

s & t

Erzeugt ein neues Set, das die Objekte enthält, die sowohl Element der Menge s als auch Element der Menge t sind.

Diese Operation bildet also die Schnittmenge zweier Sets.

st

Erzeugt ein neues Set mit allen Elementen von s, außer denen, die auch in t enthalten sind.

Diese Operation erzeugt also die Differenz zweier Mengen.

s ^ t

Erzeugt ein neues Set, das alle Objekte enthält, die entweder in s oder in t vorkommen, nicht aber in beiden.

Diese Operation bildet also die symmetrische Differenz zweier Mengen.


Im Folgenden werden alle Operatoren anhand von Beispielen anschaulich beschrieben. Die Beispiele sind dabei in diesem Kontext zu sehen:

>>> s = set([0,1,2,3,4,5,6,7,8,9]) 
>>> t = set([6,7,8,9,10,11,12,13,14,15])

Es existieren also zwei Mengen namens s und t, die aus Gründen der Übersichtlichkeit jeweils ausschließlich über numerische Elemente verfügen. Die Mengen überschneiden sich in einem gewissen Bereich. Grafisch kann die Ausgangssituation folgendermaßen veranschaulicht werden. Der dunkelgraue Bereich entspricht der Schnittmenge von s und t.

Abbildung 8.7  Die Ausgangssituation

Anzahl der Elemente

Um die Anzahl der Elemente zu bestimmen, die in einer Menge enthalten sind, wird – wie schon bei den sequenziellen Datentypen sowie dem Dictionary – die eingebaute Funktion len verwendet:

>>> len(s) 
10
Ist ein Element im Set enthalten?

Um zu testen, ob ein Element in einem Set enthalten ist, dient der Operator in. Zudem kann sein Gegenstück not in verwendet werden, um das Gegenteil zu prüfen:

>>> 10 in s 
False 
>>> 10 not in t 
False
Handelt es sich um eine Teilmenge?

Um zu testen, ob es sich bei einem Set um eine Teilmenge eines anderen Sets handelt, werden die Operatoren <= und >=, sowie < und > für echte Teilmengen, verwendet:

>>> u = set([4,5,6]) 
>>> u <= s 
True 
>>> u < s 
True 
>>> u >= s 
False 
>>> u <= t 
False

Beachten Sie den Unterschied zwischen Teilmenge (<=, >=) und echter Teilmenge (<, >) an folgendem Beispiel:

>>> m = set([1,2,3]) 
>>> n = set([1,2,3]) 
>>> m <= n 
True 
>>> m < n 
False
Vereinigung zweier Mengen

Um zwei Mengen zusammenzufügen, kann der Operator | verwendet werden. Es wird ein neues Set erzeugt, das alle Elemente enthält, die in s oder in t enthalten sind:

>>> s | t 
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])

Bezogen auf unsere Grafik bedeutet das Folgendes:

Abbildung 8.8  Vereinigungsmenge von s und t

Schnittmenge

Um die Schnittmenge zweier Mengen zu bestimmen, wird der Operator & verwendet. Es wird ein neues Set erzeugt, das alle Elemente enthält, die sowohl im ersten als auch im zweiten Operanden enthalten sind.

>>> s & t 
set([8, 9, 6, 7])

Auch die Auswirkungen dieses Operators können wir veranschaulichen:

Abbildung 8.9  Schnittmenge von s und t

Differenz zweier Mengen

Um die Differenz zweier Mengen zu bestimmen, wird der Operator - verwendet. Es wird ein neues Set erzeugt, das alle Elemente des ersten Operanden enthält, die nicht zugleich im zweiten Operanden enthalten sind:

>>> s - t 
set([0, 1, 2, 3, 4, 5]) 
>>> t - s 
set([10, 11, 12, 13, 14, 15])

Grafisch bedeutet dies:

Abbildung 8.10  Differenz von s und t

Symmetrische Differenz zweier Mengen

Um die symmetrische Differenz zweier Mengen zu bestimmen, wird der Operator ^ verwendet. Es wird ein neues Set erzeugt, das alle Elemente enthält, die entweder im ersten oder im zweiten Operanden vorkommen, nicht aber in beiden gleichzeitig:

>>> s ^ t 
set([0, 1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15])

Gönnen wir uns einen letzten Blick auf unsere Grafik:

Abbildung 8.11  Symmetrische Differenz von s und t

Methoden

Die Datentypen set und frozenset verfügen über eine recht überschaubare Liste von Methoden, die in ihrem Zweck sogar größtenteils gleichbedeutend mit einem der bereits diskutierten Operatoren sind. Sie haben dennoch ihre Daseinsberechtigung, da sie aufgrund ihres Namens im Quelltext selbsterklärend sind – ganz im Gegensatz zu einem Operator, dessen Sinn sich erst nach intensiver Beschäftigung mit set und frozenset erschließt:


Tabelle 8.29  Methoden der Datentypen set und frozenset
Methode Beschreibung

s.issubset(t)

Äquivalent zu s <= t

s.issuperset(t)

Äquivalent zu s >= t

s.union(t)

Äquivalent zu s | t

s.intersection(t)

Äquivalent zu s & t

s.difference(t)

Äquivalent zu st

s.symmetric_difference(t)

Äquivalent zu s ^ t

s.copy()

Erzeugt eine Kopie des Sets s


s.copy()

Um eine Kopie eines Sets zu erzeugen, wird die Methode copy verwendet:

>>> m = s.copy() 
>>> m 
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> m is s 
False 
>>> m == s 
True

Wichtig ist, dass nur das Set selbst kopiert wird. Bei den enthaltenen Elementen handelt es sich sowohl in der ursprünglichen Menge als auch in der Kopie um Referenzen auf dieselben Objekte. Dies ist Ihnen bereits aus Abschnitt 8.5.1, »Listen – list«, geläufig.


Galileo Computing - Zum Seitenanfang

8.7.1 Mengen – set  Zur nächsten ÜberschriftZur vorigen Überschrift

Das set bietet, als Datentyp für veränderliche Mengen, einige Operatoren und Methoden, die über den eben besprochenen Grundbestand hinausgehen. Beachten Sie, dass alle hier eingeführten Operatoren und Methoden nicht für frozenset verfügbar sind. Zuallererst möchten wir darauf eingehen, dass auch hier wie selbstverständlich erweiterte Zuweisungen für die oben eingeführten Operatoren verwendet werden dürfen:


Tabelle 8.30  Operatoren des Datentyps set
Operator Entsprechung

s |= t

s = s | t

s &= t

s = s & t

s -= t

s = s – t

s ^= t

s = s ^ t

Neben diesen neuen Operatoren stellt ein set fünf neue Methoden bereit, die es vom frozenset unterscheiden. Des Weiteren existieren auch für erweiterte Zuweisungsoperatoren Alternativen in Form einer Methode:


Tabelle 8.31  Methoden des Datentyps set
Methode Beschreibung

s.update(t)

Äquivalent zu s |= t

s.intersection_update(t)

Äquivalent zu s &= t

s.difference_update(t)

Äquivalent zu s -= t

s.symmetric_difference_update(t)

Äquivalent zu s ^= t

s.add(e)

Fügt das Objekt e als Element in das Set s ein.

s.remove(e)

Löscht das Element e aus dem Set s. Sollte e nicht vorhanden sein, wird eine Exception erzeugt.

s.discard(e)

Löscht das Element e aus dem Set s. Sollte e nicht vorhanden sein, wird dies ignoriert.

s.clear()

Löscht alle Elemente des Sets s, jedoch nicht das Set selbst.


Diese Methoden möchten wir nachfolgend anhand eines Beispiels erläutern. Die Beispiele sind dabei in diesem Kontext zu sehen:

>>> s = set([1,2,3,4,5]) 
>>> s 
set([1, 2, 3, 4, 5])
s.add(e)

Die Methode add fügt ein Element e in das Set s ein:

>>> s.add(6) 
>>> s 
set([1, 2, 3, 4, 5, 6])

Sollte e bereits im Set vorhanden sein, so wird dies ignoriert.

s.remove(e)

Die Methode remove löscht das Element e aus dem Set s:

>>> s.remove(5) 
>>> s 
set([1, 2, 3, 4, 6])

Sollte das zu löschende Element nicht im Set vorhanden sein, so wird eine Fehlermeldung erzeugt:

>>> s.remove(17) 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
KeyError: 17
s.discard(e)

Die Methode discard löscht ein Element e aus dem Set s. Der einzige Unterschied zur Methode remove besteht darin, dass keine Fehlermeldung erzeugt wird, wenn e nicht in s vorhanden ist:

>>> s.discard(5) 
>>> s 
set([1, 2, 3, 4]) 
>>> s.discard(17) 
>>> s 
set([1, 2, 3, 4])
s.clear()

Die Methode clear entfernt alle Elemente aus dem Set s. Das Set selbst bleibt nach dem Aufruf von clear jedoch weiterhin vorhanden:

>>> s.clear() 
>>> s 
set([])

Galileo Computing - Zum Seitenanfang

8.7.2 Unveränderliche Mengen – frozenset  topZur vorigen Überschrift

Da es sich bei einem frozenset lediglich um eine Version des set handelt, die nach dem Erstellen nicht mehr verändert werden darf, wurden alle Operatoren und Methoden bereits im Rahmen der Grundfunktionalität zu Beginn des Kapitels erklärt. Beachten Sie, dass ein frozenset nicht nur selbst unveränderlich ist, sondern auch nur unveränderliche Elemente enthalten darf:

>>> frozenset([1, 2, 3, 4]) 
frozenset([1, 2, 3, 4]) 
>>> frozenset([[1, 2], [3, 4]]) 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
TypeError: list objects are unhashable

Welche Vorteile bietet nun das explizite Behandeln einer Menge als unveränderlich? Nun, neben gewissen Vorteilen in puncto Geschwindigkeit und Speichereffizienz kommt, wir erinnern uns, als Schlüssel eines Dictionarys nur ein unveränderliches Objekt in Frage. Innerhalb eines Dictionarys kann also ein frozenset sowohl als Schlüssel als auch als Wert verwendet werden. Das möchten wir im folgenden Beispiel veranschaulichen:

>>> d = {frozenset([1,2,3,4]) : "Hello World"} 
>>> d 
{frozenset([1, 2, 3, 4]): 'Hello World'}

Im Gegensatz dazu passiert Folgendes, wenn versucht wird, ein set als Schlüssel zu verwenden:

>>> d = {set([1,2,3,4]) : "Hello World"} 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
TypeError: set objects are unhashable

Mit dem set haben wir den letzten Basisdatentyp behandelt. Freuen Sie sich nun darauf, das Gelernte anzuwenden. Im nächsten Kapitel werden wir über die verschiedenen Wege sprechen, wie ein Programm mit dem Benutzer interagieren kann.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






 <<   zurück
  
  Zum Katalog
Zum Katalog: Python






Python
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Linux






 Linux


Zum Katalog: Ubuntu GNU/Linux






 Ubuntu GNU/Linux


Zum Katalog: Praxisbuch Web 2.0






 Praxisbuch Web 2.0


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Praxisbuch Objektorientierung






 Praxisbuch Objektorientierung


Zum Katalog: Einstieg in SQL






 Einstieg in SQL


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für Fachinformatiker


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo