Frage

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, konnte aber nicht herausfinden, wo ein solcher Datentyp in der Praxis nützlich wäre.Kann ich einige Beispiele nennen, vielleicht in Python, wo eine unveränderliche Menge von Zahlen benötigt würde?Wie unterscheidet sich das von einer Liste?

War es hilfreich?

Lösung

  • Tupel werden immer dann verwendet, wenn Sie mehrere Ergebnisse 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 dies nicht).

Andere Tipps

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

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

Ich habe diese Funktion hauptsächlich verwendet, um ein Wörterbuch mit Schlüsseln zu erstellen, die Koordinaten der Scheitelpunkte eines Netzes sind.In meinem speziellen Fall funktionierte der genaue Vergleich der beteiligten Gleitkommazahlen jedoch gut, was für Ihre Zwecke möglicherweise nicht immer zutrifft [in diesem Fall würde ich Ihre eingehenden Gleitkommazahlen wahrscheinlich in eine Art Festkomma-Ganzzahl umwandeln]

Ich mag diese Erklärung.

Grundsätzlich sollten Sie Tupel verwenden, wenn eine konstante Struktur vorliegt (die erste Position enthält immer einen Werttyp und die zweite einen anderen usw.), und Listen sollten für Listen homogener Werte verwendet werden.

Natürlich gibt es immer Ausnahmen, aber das ist eine gute allgemeine Richtlinie.

Tupel und Listen haben im Allgemeinen die gleichen Verwendungszwecke.Unveränderliche Datentypen bieten im Allgemeinen viele Vorteile, vor allem im Hinblick auf Probleme mit der Parallelität.

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

Typische Beispiele sind feste Daten in einer Anwendung wie Unternehmensbereiche, Kategorien usw.Wenn sich diese Daten ändern, erstellt normalerweise ein einzelner Produzent das Tupel neu.

Der beste Weg, darüber nachzudenken, ist:

  • Ein Tupel ist ein aufzeichnen 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 noch ausführlicher:

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 weitergeben möchten, der nur wenige Felder enthält, oder einen Datensatz, der nur an wenigen Stellen verwendet wird.In diesem Fall könnte die Angabe eines völlig neuen Datensatztyps mit Feldnamen (in Python würden Sie wie oben ein Objekt oder ein Wörterbuch verwenden) zu ausführlich sein.

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

type alias Person = (String, Int)

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

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

Das Obige steht im krassen Gegensatz zu Listen, die eine variable Länge haben sollen (normalerweise ist die Anzahl der Elemente 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 hätten beispielsweise eine Liste mit Personen und eine andere Liste mit Adressen – Sie würden Personen und Adressen nicht in derselben Liste mischen.Während das Mischen verschiedener Datentypen innerhalb desselben Tupels der Sinn von Tupeln ist.Felder in einem Tupel sind normalerweise von unterschiedlichem Typ (jedoch nicht immer – z. B.Du könntest einen haben (Float, Float, Float) Tupel zur Darstellung von x-, y-, z-Koordinaten).

Tupel und Listen sind häufig verschachtelt. Es ist üblich, eine Liste von Tupeln zu haben.Sie könnten eine Liste von Person-Tupeln genauso wie eine Liste von Person-Objekten haben.Sie können auch ein Tupelfeld haben, dessen Wert eine Liste ist.Wenn Sie beispielsweise ein Adressbuch haben, in dem eine Person mehrere Adressen haben kann, könnten Sie ein Tupel vom Typ haben (Person, [String]).Der [String] Typ wird häufig in funktionalen Programmiersprachen verwendet, um eine Liste von Zeichenfolgen zu bezeichnen.In Python würden Sie den Typ nicht aufschreiben, aber Sie könnten solche Tupel auf genau die gleiche Weise verwenden, indem Sie a eingeben Person Objekt im ersten Feld eines Tupels und eine Liste von Zeichenfolgen im zweiten Feld.

In Python kommt es zu Verwirrung weil die Sprache es nicht tut erzwingen jede dieser Praktiken, die vom Compiler in statisch typisierten funktionalen Sprachen erzwungen werden.In diesen Sprachen können Sie verschiedene Arten von Tupeln nicht mischen.Beispielsweise können Sie a nicht zurückgeben (String, String) Tupel einer Funktion, deren Typ angibt, dass sie a zurückgibt (String, Integer) Tupel.Sie können auch keine Liste zurückgeben, wenn der Typ besagt, dass Sie planen, ein Tupel zurückzugeben, und umgekehrt.Listen werden ausschließlich für wachsende Sammlungen von Elementen und Tupel ausschließlich für Datensätze mit fester Größe verwendet.Python hindert Sie nicht daran, eine dieser Regeln zu brechen, wenn Sie möchten.

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

In Python sind Listen veränderbar und Tupel unveränderlich.Dies ist jedoch nur eine Entwurfsentscheidung und keine intrinsische Eigenschaft von Listen und Tupeln in der Informatik.Sie könnten 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, weshalb sie gelegentlich aus diesem Grund verwendet werden, selbst wenn die Benennung der Felder mithilfe eines Objekts oder Wörterbuchs klarer wäre.

Um schließlich noch deutlicher zu machen, dass Tupel eine andere Art von Datensatz sein sollen (keine andere Art von Liste), hat Python dies auch getan 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 äußerst nützlich, aber das Thema ist viel zu komplex, um es hier zu beantworten.Der Hauptpunkt ist, dass es einfacher ist, über Dinge nachzudenken, die sich nicht ändern können, als über Dinge, die sich ändern können.Die meisten Softwarefehler sind darauf zurückzuführen, dass sich Dinge auf unerwartete Weise ändern. Daher ist die Einschränkung der Änderungsmöglichkeiten eine gute Möglichkeit, Fehler zu beseitigen.Bei Interesse empfehle ich die Lektüre eines Tutorials für eine funktionale Programmiersprache wie Elm, Haskell oder Clojure (Elm ist die benutzerfreundlichste).Die Designer dieser Sprachen hielten die Unveränderlichkeit für so nützlich, dass alle Listen sind dort unveränderlich.(Anstatt eine Liste zu ändern, um ein Element hinzuzufügen oder zu entfernen, können Sie Erstellen Sie eine neue Liste mit dem hinzugefügten oder entfernten Element.Unveränderlichkeit garantiert, dass sich die alte Kopie der Liste niemals ändern kann, sodass der Compiler und die Laufzeit den Code durch die Wiederverwendung von Teilen der alten Liste in der neuen und die Müllsammlung der verbleibenden Teile, wenn sie länger sind, für eine gute Leistung des Codes sorgen können erforderlich.)

Ich finde sie nützlich, wenn man immer mit zwei oder mehr Objekten als Set arbeitet.

Ein Tupel ist eine Folge von Werten.Die Werte können einen beliebigen Typ haben und werden durch Ganzzahlen indiziert, sodass Tupel nicht wie Listen sind.Der wichtigste Unterschied besteht darin Tupel sind unveränderlich.

Ein Tupel ist eine durch Kommas getrennte Liste von Werten:

t = 'p', 'q', 'r', 's', 't'

Es empfiehlt sich, Tupel in Klammern zu setzen:

t = ('p', 'q', 'r', 's', 't') 

Eine Liste kann in Bezug auf die Funktionalität immer ein Tupel ersetzen (außer anscheinend als Schlüssel in einem Diktat).Ein Tupel kann jedoch dafür sorgen, dass die Dinge schneller gehen.Das Gleiche gilt beispielsweise für unveränderliche Zeichenfolgen in Java – wann müssen Sie Ihre Zeichenfolgen jemals nicht ändern können?Niemals!

Ich habe gerade eine anständige Diskussion darüber gelesen, wie man die Möglichkeiten einschränkt, um bessere Programme zu erstellen. Warum funktionale Programmierung wichtig ist

Ein Tupel ist nützlich zum Speichern mehrerer Werte.Wie Sie bemerken, ist ein Tupel wie eine Liste, die unveränderlich ist – z.Nach der Erstellung können Sie keine Elemente mehr hinzufügen/entfernen/austauschen.

Ein Vorteil der Unveränderlichkeit besteht darin, dass die Laufzeit des Tupels bestimmte Optimierungen durchführen kann, da das Tupel eine feste Größe hat.Dies ist besonders vorteilhaft, wenn ein Tupple im Kontext eines Rückgabewerts oder eines Parameters einer Funktion verwendet wird.

Zusätzlich zu den Stellen, an denen sie syntaktisch erforderlich sind, etwa bei der String-%-Operation und für mehrere Rückgabewerte, verwende ich Tupel als eine Form von leichtgewichtigen Klassen.Angenommen, Sie haben ein Objekt, das von einer Methode ein undurchsichtiges Cookie an einen Aufrufer weitergibt, das dann an eine andere Methode übergeben wird.Ein Tupel ist eine gute Möglichkeit, mehrere Werte in dieses Cookie zu packen, ohne eine separate Klasse definieren zu müssen, um sie zu enthalten.

Ich versuche jedoch, bei dieser speziellen Verwendung mit Bedacht vorzugehen.Wenn die Cookies im gesamten Code großzügig verwendet werden, ist es besser, eine Klasse zu erstellen, da dies hilft, ihre Verwendung zu dokumentieren.Wenn sie nur an einem Ort verwendet werden (z. B.ein Methodenpaar), dann verwende ich möglicherweise ein Tupel.Da es sich um Python handelt, können Sie auf jeden Fall mit einem Tupel beginnen und es dann in eine Instanz einer benutzerdefinierten Klasse ändern, ohne Code im Aufrufer ändern zu müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top