Was sind genau Tupel?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

Hallo Leute - ja, absolute n00b Frage, aber ich bin blutiger Anfänger und weiß es halt nicht besser:
Ich lerne Python 3 mit dem Buch "Einstieg in Python" aus dem Galileo Computing Verlag. Ich bin gerade im Kapitel "4.4 Tupel". Der Absatz ist nicht sehr lang; böse Zungen könnten sagen: "Oberflächlich". Ich verstehe anhand des kurzen Abschnittes leider nicht was genau Tupel sind ... :K Das alleine wäre auch nicht schlimm, würde in Erklärungen zu folgenden Operationen und ähnlichem nicht immer wieder ein Vergleich zu Tupeln gezogen und das somit als bekannt vorausgesetzt werden :P

Also ich erkläre mal soweit ich meine das verstanden zu haben und ich würde mich freuen, wenn mich dabei jemand korigieren und das ganze ggf. noch genauer erklären könnte.

Also Tupel sind fast dasselbe wie eine Liste, nur das Tupel nicht veränderbar sind. -> Ja? =)

Was das Buch leider ausläst ist, was das genau heißt und wo der Unterschied von der Tupel-Definitionssyntax her zwischen der Erstellung von Tupel und Variablen liegt. Es folgt z.B. folgendes Codebeispiel:

Code: Alles auswählen

x,y = 2,18
... gefolgt von folgender Erklärung:
Mithilfe eines Tupels kann die Zuweisung von mehreren Werten gleichzeitig realisiert werden. Im vorliegendem Beispiel werden die Werte 2 bzw. 18 den Einzelvariablen x und y zugewiesen.
... genau so sehe ich das auch: Hier werden einfach nur 2 Variablen mit einer kürzeren Schreibweise als

Code: Alles auswählen

x = 2
y = 18
zugewiesen - was hat das mit Tupeln zu tun? Und was ist hieran nicht veränderbar?

Ein zweites Beispiel aus dem Buch das ich nicht verstehe:

Code: Alles auswählen

for i in 4, 5, 12:
    print("i:", i)
Leider gibt es hierzu bis auf folgenden Kommentar garkeine Erklärung was das mit dem neuen Thema "Tupel" zu tun hat:
#Tupel bei for-Schleife
:P

Also ich verstehe schon, was es mit Tupeln so auf sich hat, wenn ich etwas wie dieses hier sehe:

Code: Alles auswählen

a = (1, 2, "Hallo")
b = 1, 4, "Tschüss"
Aber die beiden anderen o.g. Beispiele lassen mich echt im dunkeln tappen :K
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Judge hat geschrieben:

Code: Alles auswählen

x,y = 2,18
... gefolgt von folgender Erklärung:
Mithilfe eines Tupels kann die Zuweisung von mehreren Werten gleichzeitig realisiert werden. Im vorliegendem Beispiel werden die Werte 2 bzw. 18 den Einzelvariablen x und y zugewiesen.
Das ist schon ein wenig hinterlistig, da man vom Tupel selber so gar nichts zu sehen glaubt. Wichtig ist aber, dass sich das Tupel hier alleine über die Verbindung durch Kommas definiert. Klammern sind in diesem Fall nicht erforderlich. Hier wurden Tuple-Packing und Unpacking in einer Zeile kombiniert. Schau dir mal folgenden Code an der es klarer machen sollte:

Code: Alles auswählen

>>> value = 1, 2, 3
>>> value
(1, 2, 3)
>>> x, y, z = value
>>> z
3
Judge hat geschrieben:Ein zweites Beispiel aus dem Buch das ich nicht verstehe:

Code: Alles auswählen

for i in 4, 5, 12:
    print("i:", i)
Leider gibt es hierzu bis auf folgenden Kommentar garkeine Erklärung was das mit dem neuen Thema "Tupel" zu tun hat:
(4, 5, 12) ist das Tupel.


Was die Veränderbarkeit angeht kannst du das einfach selber ausprobieren.

Code: Alles auswählen

>>> value = 1, 2
>>> print value[0]
1
>>> value[0] = 3

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    value[0] = 3
TypeError: 'tuple' object does not support item assignment
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Judge hat geschrieben:Hallo Leute - ja, absolute n00b Frage, aber ich bin blutiger Anfänger und weiß es halt nicht besser:
Ich lerne Python 3 mit dem Buch "Einstieg in Python" aus dem Galileo Computing Verlag.
Ich lege dir mal das Tutorial der Python Dokumentation ans Herz, wenn es am Englischen scheitert, findest du die Uebersetzung in meiner Signatur. Die Python Galileo Buecher kommen leider nicht so besonders gut weg.
Judge hat geschrieben:Also Tupel sind fast dasselbe wie eine Liste, nur das Tupel nicht veränderbar sind. -> Ja? =)
Ja, das ist im Grunde der einzige Unterschied.
Judge hat geschrieben:Was das Buch leider ausläst ist, was das genau heißt und wo der Unterschied von der Tupel-Definitionssyntax her zwischen der Erstellung von Tupel und Variablen liegt. Es folgt z.B. folgendes Codebeispiel:

Code: Alles auswählen

x,y = 2,18
... gefolgt von folgender Erklärung:
Mithilfe eines Tupels kann die Zuweisung von mehreren Werten gleichzeitig realisiert werden. Im vorliegendem Beispiel werden die Werte 2 bzw. 18 den Einzelvariablen x und y zugewiesen.
... genau so sehe ich das auch: Hier werden einfach nur 2 Variablen mit einer kürzeren Schreibweise als

Code: Alles auswählen

x = 2
y = 18
zugewiesen - was hat das mit Tupeln zu tun? Und was ist hieran nicht veränderbar?
Ein Komma erstellt Tupel, das ist die ganze Magie. Hier wird mit `2, 18` also ein Tupel erstellt, das bei der Zuweisung wieder entpackt wird. Das ist aber nicht speziell fuer Tupel so, sondern ganz allgemein fuer Sequenzen, so tut `x, y = [2, 18]` dasselbe mit einer Liste.

Unveraenderbar sind beide Ansaetze, schliesslich gibt es das Tupel bzw die Liste nur in dieser einen Zeile. Der Unterschied zeigt von Tupel und Liste zeigt sich zum Beispiel hier:

Code: Alles auswählen

In [1]: a = (1, 2, 3)

In [2]: b = [1, 2, 3]

In [3]: b[1] = 23

In [4]: b
Out[4]: [1, 23, 3]

In [5]: a[1] = 23
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/home/cofi/<ipython-input-5-6ba5baf3925e> in <module>()
----> 1 a[1] = 23

TypeError: 'tuple' object does not support item assignment
Judge hat geschrieben: Ein zweites Beispiel aus dem Buch das ich nicht verstehe:

Code: Alles auswählen

for i in 4, 5, 12:
    print("i:", i)
Leider gibt es hierzu bis auf folgenden Kommentar garkeine Erklärung was das mit dem neuen Thema "Tupel" zu tun hat:
#Tupel bei for-Schleife
Siehe oben, Tupel werden mit Kommata erstellt, d.h. `4, 5, 12` entspricht `(4, 5, 12)`. Die Klammern zu verwenden macht allerdings des oefteren die Absicht klarer.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich sehe das vor allem aus der semantischen Sicht: Wenn ich eine feststehende Anzahl von Parametern habe, dann nehme ich lieber einen Tupel. Das wäre zum Beispiel bei den jeweiligen Werten für `x` und `y` bei einer Koordinatenangabe der Fall. Bei einer variablen Anzahl von Elementen nehme ich hingegen eine Liste. Um bei dem genannten Beispiel zu bleiben, wären das dann meinetwegen mehrere Koordinaten von irgendeinem Streckenverlauf - also eine Liste von Koordinaten-Tupeln.

Mit diesem Ansatz ist jetzt aber nicht gemeint, dass man immer Tupel nutzen soll, wenn man die Anzahl der Elemente kennt. Habe ich zum Beispiel eine Funktion namens `print_names()` und erwartet diese eine Liste (da sie die Anzahl der übergebenen Namen nicht kennt) und habe ich dann 3 Namen, die der Funktion übergeben werden sollen, dann mache ich dies natürlich per Liste. Auch wenn die Übergabe eines Tupel theoretisch genau so als Funktionsargument funktionieren würde.

//edit: Auch wenn dieser Beitrag eigentlich keine direkte Antwort auf die Fragestellung ist... :mrgreen:
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

Hi Ihr 3,

boah - in so kurzer Zeit 3 so verständliche und ausführliche Antworten - geil! Somit ist mir das jetzt klar und vielen Dank an Euch! :)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Um snafus Antwort etwas auszufuehren: Kannst du einer Position in einer Sequenz eine Bedeutung zuordnen, dann nimm ein Tupel. Hast du (eher) homogene Daten, nutze eine Liste.

Das kann man sich, wenn man denn will, auch aus der Mengenlehre ableiten, wo das kartesische Produkt A x B x C ebenfalls 3-er Tupel erstellt, wobei das erste Element aus A, das zweite aus B und das dritte aus C stammt.

Genau sowas kann man auch fuer Snafus Beispiel machen und kommt bei Koordinaten = ℤ x ℤ heraus.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

snafu hat geschrieben:Ich sehe das vor allem aus der semantischen Sicht: Wenn ich eine feststehende Anzahl von Parametern habe, dann nehme ich lieber einen Tupel. Das wäre zum Beispiel bei den jeweiligen Werten für `x` und `y` bei einer Koordinatenangabe der Fall.
Und da kann dann auch noch namedtuple zum Einsatz kommen. (@Judge: nicht verwirren lassen :) )
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

cofi hat geschrieben:Um snafus Antwort etwas auszufuehren: Kannst du einer Position in einer Sequenz eine Bedeutung zuordnen, dann nimm ein Tupel. Hast du (eher) homogene Daten, nutze eine Liste.
... mit der Ausnahme das es mit Python 3 nun "starred" gibt, die das etwas aufweichen, oder?

Ex.:

Code: Alles auswählen

x,*y,z = 1, 2, 3, 4
Der Rest ist mir leider zu akademisch und übersteigt meinen Horizont :)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Judge hat geschrieben:
cofi hat geschrieben:Um snafus Antwort etwas auszufuehren: Kannst du einer Position in einer Sequenz eine Bedeutung zuordnen, dann nimm ein Tupel. Hast du (eher) homogene Daten, nutze eine Liste.
... mit der Ausnahme das es mit Python 3 nun "starred" gibt, die das etwas aufweichen, oder?

Ex.:

Code: Alles auswählen

x,*y,z = 1, 2, 3, 4
Nein, das hat mit dem Problem gar nichts zu tun, sondern ist nur eine Erweiterung des Sequence Unpackings. Dass y hier eine Liste mit den entsprechenden Werten zugewiesen bekommen ist irrelevant.

Code: Alles auswählen

auto = ("Mercedes", "Z-Klasse", "Fritz", 5, 23, -1, 42)
hersteller, typ, besitzer, *position, geschwindigkeit = auto
Das erfuellt doch immernoch die obige Beschreibung, oder nicht?

Die Verwendung von Tupeln die Snafu vorgeschlagen hat, bezieht sich auf die _bewusste_ Verwendung deinerseits. Mit `namedtuple` wird das ganze noch deutlicher. Betrachte Tupel hier einfach v.a. als Moeglichkeit um Daten zu strukturieren und weniger als "Listen, aber nicht veraenderbar". Die Essenz von Tupeln ist aber auf keinen Fall, dass man damit Mehrfachzuweisungen machen kann. Das ist eher ein Bonus und trifft wie gesagt auch auf andere Sequenzen zu.
Judge hat geschrieben:Der Rest ist mir leider zu akademisch und übersteigt meinen Horizont :)
Nein, Typen und Wertebereich aka Domänen sind bei der Programmierung reichlich unakademisch ;) Lass dich nicht von der Notation verwirren, das Ziel war nur eine andere Betrachtungsweise.
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

cofi hat geschrieben:
Judge hat geschrieben:
cofi hat geschrieben:Um snafus Antwort etwas auszufuehren: Kannst du einer Position in einer Sequenz eine Bedeutung zuordnen, dann nimm ein Tupel. Hast du (eher) homogene Daten, nutze eine Liste.
... mit der Ausnahme das es mit Python 3 nun "starred" gibt, die das etwas aufweichen, oder?

Ex.:

Code: Alles auswählen

x,*y,z = 1, 2, 3, 4
Nein, das hat mit dem Problem gar nichts zu tun, sondern ist nur eine Erweiterung des Sequence Unpackings. Dass y hier eine Liste mit den entsprechenden Werten zugewiesen bekommen ist irrelevant.

Code: Alles auswählen

auto = ("Mercedes", "Z-Klasse", "Fritz", 5, 23, -1, 42)
hersteller, typ, besitzer, *position, geschwindigkeit = auto
Das erfuellt doch immernoch die obige Beschreibung, oder nicht?
Stimmt! :)

Nagut - ich denke ich bin soweit im Bilde! Vielen Dank nochmal!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

cofi hat geschrieben:Um snafus Antwort etwas auszufuehren: Kannst du einer Position in einer Sequenz eine Bedeutung zuordnen, dann nimm ein Tupel. Hast du (eher) homogene Daten, nutze eine Liste.
Richtig, um da ein Beispiel zu bringen: RGB-Werte würde ich etwa in Tupel abbilden, (R, G, B) wobei R, G und B jeweils Werte zwischen 0 und 255 sind, also ist jede Position semantisch wichtig. Wenn es aber einfach nur Sequenzen sind wie [1, 2, 3] wie das im Buch beschrieben würd, ist eine Liste zu bevorzugen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten