57 Stimmen

Wozu ist ein Tupel nützlich?

Ich lerne gerade Python für einen Kurs, und wir haben gerade Tupel als einen der Datentypen behandelt. Ich habe die Wikipedia-Seite dazu gelesen, aber ich konnte nicht herausfinden, wo ein solcher Datentyp in der Praxis nützlich sein könnte. Kann ich ein paar Beispiele haben, vielleicht in Python, wo eine unveränderliche Menge von Zahlen benötigt wird? Worin besteht der Unterschied zu einer Liste?

66voto

Chris Upchurch Punkte 14893
  • Tupel werden verwendet, wenn Sie mehrere Ergebnisse aus einer Funktion zurückgeben möchten.
  • Da sie unveränderlich sind, können sie als Schlüssel für ein Wörterbuch verwendet werden (Listen können das nicht).

21voto

sphereinabox Punkte 846

Tupel eignen sich gut als Wörterbuchschlüssel, wenn Sie mehr als einen Teil der Daten in Ihrem Schlüssel kombinieren müssen und keine Lust haben, eine Klasse dafür zu erstellen.

a = {}
a[(1,2,"bob")] = "hello!"
a[("Hello","en-US")] = "Hi There!"

Ich habe diese Funktion in erster Linie verwendet, um ein Wörterbuch mit Schlüsseln zu erstellen, die Koordinaten der Eckpunkte eines Netzes sind. In meinem speziellen Fall hat der exakte Vergleich der beteiligten Fließkommazahlen jedoch gut funktioniert, was für Ihre Zwecke vielleicht nicht immer zutrifft [in diesem Fall würde ich die eingehenden Fließkommazahlen wahrscheinlich in eine Art Festkommazahl konvertieren].

14voto

Lassi Punkte 2932

Der beste Weg, darüber nachzudenken, ist:

  • Ein Tupel ist ein Eintrag deren Felder keine Namen haben.
  • Sie verwenden ein Tupel anstelle eines Datensatzes, wenn Sie sich nicht die Mühe machen können, die Feldnamen anzugeben.

Anstatt also Dinge zu schreiben wie:

person = {"name": "Sam", "age": 42}
name, age = person["name"], person["age"]

Oder die noch wortreichere:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person = Person("Sam", 42)
name, age = person.name, person.age

Sie können einfach schreiben:

person = ("Sam", 42)
name, age = person

Dies ist nützlich, wenn Sie einen Datensatz mit nur wenigen Feldern oder einen Datensatz, der nur an einigen wenigen Stellen verwendet wird, weitergeben möchten. In diesem Fall könnte die Angabe eines völlig neuen Datensatztyps mit Feldnamen (in Python würden Sie ein Objekt oder ein Wörterbuch verwenden, wie oben beschrieben) zu umfangreich sein.

Tupel stammen aus der Welt der funktionalen Programmierung (Haskell, OCaml, Elm, F# usw.), wo sie üblicherweise für diesen Zweck verwendet werden. Im Gegensatz zu Python sind die meisten funktionalen Programmiersprachen statisch typisiert (eine Variable kann nur einen Wertetyp enthalten, und dieser Typ wird zur Kompilierzeit bestimmt). Die statische Typisierung macht die Rolle von Tupeln deutlicher. Zum Beispiel in der Sprache Elm:

type alias Person = (String, Int)

person : Person
person = ("Sam", 42)

Dies unterstreicht die Tatsache, dass eine bestimmte Art von Tupel immer eine feste Anzahl von Feldern in einer festen Reihenfolge haben muss, und jedes dieser Felder muss immer vom gleichen Typ sein. In diesem Beispiel ist eine Person immer ein Tupel aus zwei Feldern, von denen eines eine Zeichenkette und das andere eine Ganzzahl ist.

Dies steht im krassen Gegensatz zu den Listen die eine variable Länge haben sollen (die Anzahl der Elemente ist normalerweise in jeder Liste unterschiedlich, und Sie schreiben Funktionen zum Hinzufügen und Entfernen von Elementen), und jedes Element in der Liste ist normalerweise vom gleichen Typ. Sie haben zum Beispiel eine Liste mit Personen und eine andere mit Adressen - Sie würden Personen und Adressen nicht in derselben Liste mischen. Das Mischen verschiedener Datentypen innerhalb eines Tupels ist jedoch der Sinn von Tupeln. Die Felder in einem Tupel sind in der Regel von unterschiedlichem Typ (aber nicht immer - z. B. könnte man eine (Float, Float, Float) Tupel zur Darstellung von x,y,z-Koordinaten).

Tupel und Listen werden häufig verschachtelt. Es ist üblich, eine Liste von Tupeln zu haben. Sie können eine Liste von Personen-Tupeln genauso gut haben wie eine Liste von Personen-Objekten. Sie können auch ein Tupelfeld haben, dessen Wert eine Liste ist. Wenn Sie zum Beispiel ein Adressbuch haben, in dem eine Person mehrere Adressen haben kann, können Sie ein Tupel vom Typ (Person, [String]) . Die [String] wird in funktionalen Programmiersprachen üblicherweise verwendet, um eine Liste von Zeichenketten zu bezeichnen. In Python würde man den Typ nicht aufschreiben, aber man könnte solche Tupel auf genau dieselbe Weise verwenden, indem man ein Person Objekt im ersten Feld eines Tupels und eine Liste von Zeichenketten in seinem zweiten Feld.

In Python kommt es zu Verwirrung weil die Sprache nicht durchsetzen. eine dieser Praktiken, die vom Compiler in statisch typisierten funktionalen Sprachen erzwungen werden. In diesen Sprachen können Sie nicht verschiedene Arten von Tupeln mischen. Zum Beispiel können Sie nicht ein (String, String) Tupel aus einer Funktion, deren Typ besagt, dass sie ein (String, Integer) Tupel. Sie können auch keine Liste zurückgeben, wenn der Typ vorgibt, dass Sie ein Tupel zurückgeben wollen, und umgekehrt. Listen werden ausschließlich für wachsende Sammlungen von Elementen verwendet, während Tupel ausschließlich für Datensätze mit fester Größe verwendet werden. Python hindert Sie nicht daran, eine dieser Regeln zu brechen, wenn Sie das wollen.

In Python wird eine Liste manchmal in ein Tupel umgewandelt, um als Wörterbuchschlüssel verwendet zu werden, da Python-Wörterbuchschlüssel unveränderliche (d.h. konstante) Werte sein müssen, während Python-Listen veränderbar sind (Sie können jederzeit Elemente hinzufügen und entfernen). Dies ist eine Abhilfe für eine bestimmte Einschränkung in Python, keine Eigenschaft von Tupeln als Informatikkonzept.

In Python sind Listen also veränderbar und Tupel unveränderbar. Aber das ist nur eine Design-Entscheidung, keine intrinsische Eigenschaft von Listen und Tupeln in der Computerwissenschaft. Man könnte genauso gut unveränderliche Listen und veränderliche Tupel haben.

In Python (unter Verwendung der Standard-CPython-Implementierung) sind Tupel für die meisten Zwecke auch schneller als Objekte oder Wörterbücher, so dass sie gelegentlich aus diesem Grund verwendet werden, selbst wenn die Benennung der Felder mit einem Objekt oder Wörterbuch klarer wäre.

Um schließlich noch deutlicher zu machen, dass Tupel eine andere Art von Datensatz (und nicht eine andere Art von Liste) sein sollen, hat Python auch benannte Tupel :

from collections import namedtuple

Person = namedtuple("Person", "name age")

person = Person("Sam", 42)
name, age = person.name, person.age

Dies ist oft die beste Wahl - kürzer als die Definition einer neuen Klasse, aber die Bedeutung der Felder ist offensichtlicher als bei der Verwendung normaler Tupel, deren Felder keine Namen haben.

Unveränderliche Listen sind für viele Zwecke sehr nützlich aber das Thema ist viel zu komplex, um es hier zu beantworten. Der wichtigste Punkt ist, dass Dinge, die sich nicht ändern können, leichter zu erklären sind als Dinge, die sich ändern können. Die meisten Softwarefehler entstehen durch Dinge, die sich auf unerwartete Weise ändern, daher ist die Einschränkung der Möglichkeiten, sie zu ändern, ein guter Weg, um Fehler zu vermeiden. Wenn Sie daran interessiert sind, empfehle ich Ihnen, ein Tutorial für eine funktionale Programmiersprache wie Elm, Haskell oder Clojure zu lesen (Elm ist die freundlichste). Die Entwickler dieser Sprachen hielten Unveränderlichkeit für so nützlich, dass a Listen sind dort unveränderlich. (Anstatt eine Liste zu ändern, um ein Element hinzuzufügen oder zu entfernen, können Sie eine neue Liste mit dem hinzugefügten oder entfernten Element erstellen . Die Unveränderlichkeit garantiert, dass sich die alte Kopie der Liste nie ändern kann, so dass der Compiler und die Laufzeit den Code gut ausführen können, indem sie Teile der alten Liste in der neuen wiederverwenden und die übrig gebliebenen Teile sammeln, wenn sie nicht mehr benötigt werden).

10voto

sherbang Punkte 14569

Ich mag diese Erklärung .

Grundsätzlich sollten Sie Tupel verwenden, wenn es eine konstante Struktur gibt (die erste Position enthält immer eine Art von Wert und die zweite eine andere usw.), und Listen sollten für Listen homogener Werte verwendet werden.

Natürlich gibt es immer Ausnahmen, aber dies ist ein guter allgemeiner Leitfaden.

5voto

Martin Salias Punkte 332

Tupel und Listen haben im Allgemeinen die gleichen Verwendungszwecke. Unveränderliche Datentypen haben im Allgemeinen viele Vorteile, vor allem in Bezug auf Gleichzeitigkeit.

Wenn Sie also Listen haben, die nicht flüchtig sind und Sie garantieren müssen, dass kein Verbraucher sie verändert, können Sie ein Tupel verwenden.

Typische Beispiele sind feste Daten in einer Anwendung wie Unternehmensbereiche, Kategorien usw. Wenn sich diese Daten ändern, wird das Tupel in der Regel von einem einzelnen Produzenten neu erstellt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X