Um mehrere Variablen gleichzeitig zu deklarieren, würde ich Folgendes tun:
a, b = True, False
Aber wenn ich viel mehr Variablen deklarieren musste, wird es immer weniger elegant:
a, b, c, d, e, f, g, h, i, j = True, True, True, True, True, False, True ,True , True, True
Gibt es eine bessere / elegante / bequeme Möglichkeit, dies zu tun?
Dies muss sehr einfach sein, aber wenn ich eine Liste oder ein Tupel zum Speichern der Variablen verwenden würde, wie müsste ich vorgehen, damit ich hilfreich wäre, da:
aList = [a,b]
Ist nicht gültig, müsste ich tun:
a, b = True, True
Oder was fehlt mir?
python
variables
declaration
Trufa
quelle
quelle
Antworten:
Wie andere vorgeschlagen haben, ist es unwahrscheinlich, dass die Verwendung von 10 verschiedenen lokalen Variablen mit Booleschen Werten der beste Weg ist, um Ihre Routine zu schreiben (insbesondere wenn sie wirklich Ein-Buchstaben-Namen haben :)
Je nachdem, was Sie tun, kann es sinnvoll sein, stattdessen ein Wörterbuch zu verwenden. Wenn Sie beispielsweise boolesche voreingestellte Werte für eine Reihe von Ein-Buchstaben-Flags einrichten möchten, können Sie Folgendes tun:
Wenn Sie möchten, können Sie dies auch mit einer einzelnen Zuweisungsanweisung tun:
Der zweite Parameter
dict
ist nicht vollständig dafür ausgelegt: Er soll es Ihnen wirklich ermöglichen, einzelne Elemente des Wörterbuchs mit Schlüsselwortargumenten wie zu überschreibend=False
. Der obige Code sprengt das Ergebnis des folgenden Ausdrucks**
in eine Reihe von Schlüsselwortargumenten, die an die aufgerufene Funktion übergeben werden. Dies ist sicherlich ein zuverlässiger Weg, um Wörterbücher zu erstellen, und die Leute scheinen diese Redewendung zumindest zu akzeptieren, aber ich vermute, dass einige sie für unpythonisch halten.</disclaimer>
Ein weiterer Ansatz, der wahrscheinlich am intuitivsten ist, wenn Sie dieses Muster häufig verwenden, besteht darin, Ihre Daten als eine Liste von Flag-Werten (
True
,False
) zu definieren, die Flag-Namen (Einzelzeichenfolgen) zugeordnet sind. Anschließend transformieren Sie diese Datendefinition in ein invertiertes Wörterbuch, das Flaggennamen Flaggenwerten zuordnet. Dies kann mit einem verschachtelten Listenverständnis recht prägnant durchgeführt werden, aber hier ist eine sehr lesbare Implementierung:Die Funktion
invert_dict
ist eine Generatorfunktion . Es generiert oder liefert - was bedeutet, dass es wiederholt Werte von - Schlüssel-Wert-Paaren zurückgibt . Diese Schlüssel-Wert-Paare sind die Umkehrung des Inhalts der beiden Elemente des ursprünglichenflags
Wörterbuchs. Sie werden in dendict
Konstruktor eingespeist . In diesem Falldict
funktioniert der Konstruktor anders als oben, da ihm als Argument eher ein Iterator als ein Wörterbuch zugeführt wird .Gestützt auf den Kommentar von @Chris Lutz: Wenn Sie dies wirklich für Einzelzeichenwerte verwenden, können Sie dies tatsächlich tun
Dies funktioniert, weil Python-Zeichenfolgen iterierbar sind , was bedeutet, dass sie Wert für Wert verschoben werden können. Bei einer Zeichenfolge sind die Werte die einzelnen Zeichen in der Zeichenfolge. Wenn sie also als iterable interpretiert werden, wie in diesem Fall, wenn sie in einer for-Schleife verwendet werden,
['a', 'b', 'c']
und'abc'
effektiv äquivalent sind. Ein anderes Beispiel wäre, wenn sie an eine Funktion übergeben werden, die eine iterierbare Funktion wie ztuple
.Ich persönlich würde dies nicht tun, weil es nicht intuitiv zu lesen ist: Wenn ich eine Zeichenfolge sehe, erwarte ich, dass sie als einzelner Wert und nicht als Liste verwendet wird. Also schaue ich in die erste Zeile und denke: "Okay, es gibt also eine wahre und eine falsche Flagge." Obwohl dies eine Möglichkeit ist, denke ich nicht, dass dies der richtige Weg ist. Auf der anderen Seite kann es hilfreich sein, die Konzepte von Iterablen und Iteratoren klarer zu erklären.
invert_dict
Es ist auch keine schlechte Idee, die Funktion so zu definieren, dass sie tatsächlich ein Wörterbuch zurückgibt. Ich habe das meistens einfach nicht gemacht, weil es nicht wirklich hilft zu erklären, wie die Routine funktioniert.Anscheinend verfügt Python 2.7 über Wörterbuchverständnisse, die eine äußerst präzise Implementierung dieser Funktion ermöglichen würden. Dies bleibt dem Leser als Übung überlassen, da ich Python 2.7 nicht installiert habe :)
Sie können auch einige Funktionen des vielseitigen itertools- Moduls kombinieren . Wie sie sagen, gibt es mehr als einen Weg, es zu tun . Warten Sie, die Python-Leute sagen das nicht. Nun, in einigen Fällen ist es sowieso wahr. Ich würde vermuten, dass Guido uns Wörterbuchverständnisse gegeben hat, damit es einen offensichtlichen Weg gibt , dies zu tun.
quelle
['a', 'b', 'c']
dass verkürzt werden kannlist('abc')
, was inspiriertdef truth_values(trues, falses): d = dict.from_keys(list(trues), True); d.update(dict.from_keys(list(falses), False)); return d
alsvalues = truth_values("abc", "de")
quelle
(d,)
wird ein Tupel mit einem Element erstellt, bei dem es sich um einen Sequenztyp handelt. Sequenztypen unterstützen unter anderem die Addition und Multiplikation.a, b, c = ([],)*3
schafft keine 3 Listeninstanzen , sondern machta
,b
undc
zeigt auf die gleiche Instanz.a, b, c = ([] for i in range(3))
. Quelle . Aus Gründen der Konsistenz können Sie für diese Antwort auch eine Variante davon verwenden, za,b,c,d,e,g,h,i,j = (True for i in range(9))
f=(False i in range(1))
.Verwenden Sie eine Liste / ein Wörterbuch oder definieren Sie Ihre eigene Klasse, um die von Ihnen definierten Elemente zu kapseln. Wenn Sie jedoch alle diese Variablen benötigen, können Sie Folgendes tun:
quelle
Dies ist eine Ausarbeitung von @ Jeff Ms und meinen Kommentaren.
Wenn Sie dies tun:
Es funktioniert mit Tupelpacken und -auspacken. Sie können die Schritte zum Ein- und Auspacken trennen:
In der ersten Zeile wird ein aufgerufenes Tupel erstellt,
_
das zwei Elemente enthält, das erste mit dem Wert vonc
und das zweite mit dem Wert vond
. Die zweite Zeile entpackt das_
Tupel in die Variablena
undb
. Dies bricht Ihre eine große Linie zusammen:In zwei kleinere Zeilen:
Sie erhalten genau das gleiche Ergebnis wie in der ersten Zeile (einschließlich derselben Ausnahme, wenn Sie einem Teil Werte oder Variablen hinzufügen, den anderen jedoch vergessen, zu aktualisieren). In diesem speziellen Fall ist Yans Antwort jedoch vielleicht die beste.
Wenn Sie eine Liste mit Werten haben, können Sie diese trotzdem entpacken. Sie müssen es nur zuerst in ein Tupel konvertieren. Im Folgenden wird beispielsweise jedem
a
Durchgang ein Wert zwischen 0 und 9 zugewiesenj
:EDIT: Ordentlicher Trick, um alle als wahr zuzuweisen, außer Element 5 (Variable
f
):quelle
Wenn Leute vorschlagen, "eine Liste, ein Tupel oder eine andere Datenstruktur zu verwenden", sagen sie, dass es möglicherweise nicht der beste Weg ist, sie alle separat als lokale Variablen zu benennen, wenn Sie viele verschiedene Werte haben, die Ihnen wichtig sind Sachen machen.
Stattdessen möchten Sie sie möglicherweise zu einer größeren Datenstruktur zusammenfassen, die in einer einzelnen lokalen Variablen gespeichert werden kann.
intuited zeigte, wie Sie ein Wörterbuch dafür verwenden können, und Chris Lutz zeigte, wie Sie ein Tupel für die temporäre Speicherung verwenden, bevor Sie es in separate Variablen entpacken. Eine weitere Option, die Sie in Betracht ziehen sollten, besteht darin
collections.namedtuple
, die Werte dauerhafter zu bündeln.Sie könnten also etwas tun wie:
Echter Code würde hoffentlich aussagekräftigere Namen verwenden als "DataHolder" und natürlich die Buchstaben des Alphabets.
quelle
DataHolder
nur etwas ausführlicher.Was ist eigentlich das Problem?
Wenn Sie wirklich 10 brauchen oder wollen , ein , b , c , d , e , f , g , h , i , j , wird es keine andere Möglichkeit geben, zu einer Zeit oder einem anderen, schreiben ein und schreiben b und Schreib c . ....
Wenn die Werte alle unterschiedlich sind, müssen Sie beispielsweise schreiben
das heißt, die "Variablen" einzeln definieren.
Oder wenn Sie eine andere Schrift verwenden, müssen Sie nicht Folgendes verwenden
_
:oder
.
Wenn einige von ihnen den gleichen Wert haben müssen, ist das Problem, dass das Schreiben zu lang ist
?
Dann können Sie schreiben:
.
Ich verstehe nicht, was genau dein Problem ist. Wenn Sie einen Code schreiben möchten, müssen Sie die Zeichen verwenden, die für das Schreiben der Anweisungen und Definitionen erforderlich sind. Was sonst ?
Ich frage mich, ob Ihre Frage nicht das Zeichen dafür ist, dass Sie etwas falsch verstehen.
Wenn man schreibt
a = 10
, erstellt man keine Variable im Sinne von "Speicherblock, dessen Wert sich ändern kann". Diese Anweisung:Entweder wird die Erstellung eines Objekts vom Typ
integer
und Wert 10 und die Bindung eines Namens 'a' mit diesem Objekt im aktuellen Namespace ausgelöstoder weisen Sie dem Objekt 10 den Namen 'a' im Namespace neu zu (weil 'a' zuvor an ein anderes Objekt gebunden wurde)
Ich sage das, weil ich das Dienstprogramm zum Definieren von 10 Bezeichnern a, b, c ... nicht sehe, die auf False oder True zeigen. Wenn sich diese Werte während der Ausführung nicht ändern, warum 10 Bezeichner? Und wenn sie sich ändern, warum zuerst die Bezeichner definieren? Werden sie bei Bedarf erstellt, wenn sie nicht zuvor definiert wurden
Ihre Frage erscheint mir komisch
quelle
Klingt so, als würden Sie sich Ihrem Problem falsch nähern.
Schreiben Sie Ihren Code neu, um ein Tupel zu verwenden, oder schreiben Sie eine Klasse, um alle Daten zu speichern.
quelle
Ich mag die Antwort mit der höchsten Abstimmung. Es gibt jedoch Probleme mit der Liste wie gezeigt.
Dies wird in großen Details besprochen (hier) , aber das Wesentliche ist , dass
a
undb
das gleiche Objekt mit dera is b
RückkehrTrue
(gleich fürid(a) == id(b)
). Wenn Sie also einen Index ändern, ändern Sie den Index von beidena
undb
, da diese verknüpft sind. Um dies zu lösen, können Sie (Quelle)Dies kann dann als Variante der Top-Antwort verwendet werden, die die "gewünschten" intuitiven Ergebnisse liefert
quelle
In Ihrem Fall würde ich YAML verwenden.
Das ist ein eleganter und professioneller Standard für den Umgang mit mehreren Parametern. Die Werte werden aus einer separaten Datei geladen. Sie können einige Informationen in diesem Link sehen:
https://keleshev.com/yaml-quick-introduction
Aber es ist einfacher, es zu googeln, da es ein Standard ist, es gibt Hunderte von Informationen darüber, Sie können herausfinden, was am besten zu Ihrem Verständnis passt. ;)
Freundliche Grüße.
quelle
Wie bei JavaScript können Sie auch in Python mehrere Anweisungen in einer Zeile verwenden
a = 1; b = "Hello World"; c += 3
quelle