2016-04-26 4 views
3

Könnte jemand bitte das Konzept erklären, eine Komma-getrennte Kette (wahrscheinlich nicht die richtige Terminologie, aber ich wollte es nicht mit list verwechseln) von Variablennamen auf der linken Seite des Zuweisungsoperators?Python mehrere Variablen auf der linken Seite des Zuweisungsoperators

Was ich mich beziehen, würde etwas von der folgenden Art seiner

reader = csv.reader(open('some_file', 'rb')) 
for row in reader: 
    k, v = row 
    myDictionary[k] = v 

Ich weiß, dass beispielsweise auf die Frage des Formats ‚irgendeine_Datei‘ führen könnte, so ist hier ein anderes Beispiel, das ich gekommen bin über

username, password = sys.argv[1:] 

ich verstehe, dass argv von der Kommandozeile kommt, und 1: bezieht sich auf alle Argumente nach dem python-Skript Namen, aber wie Benutzername und Passwort, die richtigen Produkte erhalten? Mit anderen Worten: Was begrenzt die Argumente, die an dieses Programm übergeben werden, nur den Abstand zwischen den Argumenten?

In Bezug auf das erste Beispiel, wie k und v tun aus row ihre Werte erhalten, row unter der Annahme ist eine zwei Spaltenleitung. Verwenden diese das Komma als Trennzeichen?

Jede Erklärung und/oder Links zu Python-Code oder Dokumentation wäre großartig.

+0

Willkommen bei Super User! Diese Frage bezieht sich auf das Programmieren und ist als solches hier nicht möglich, sollte aber sehr gut zu Stack Overflow passen. Anstatt die Frage zu Stack Overflow zu duplizieren, markieren Sie bitte die Frage, um einen Moderator zu bitten, sie für Sie zu verschieben. – heavyd

+2

Relevante Python-Dokumente [hier] (https://docs.python.org/2/tutorial/datastructures.html#tuples-and-sequences) – heavyd

+0

Meine schlechte, Sie sind definitiv richtig. Danke für den Beitrag dazu! – curran

Antwort

2
k, v = row 

und

username, password = sys.argv[1:] 

sind Beispiele für sequence unpacking. Das Entpacken von Sequenzen erfordert, dass die Anzahl der Variablen auf der linken Seite des Zuweisungsoperators die gleiche Anzahl von Elementen hat wie die Sequenz auf der rechten Seite. Ist dies der Fall, wird das erste Element der Sequenz der ersten Variablen zugewiesen, das zweite der zweiten und so weiter. Wenn sie nicht gleich sind, wird ein Wertfehler ausgelöst.

Str, Unicode, Liste, Tuple, Bytearray, Puffer, Xrange sind alle gültigen Sequenzen und können auf der rechten Seite des Bedieners verwendet werden.


dass alle übrig ist, zu verstehen ist, ob ‚Reihe‘ und sys.argv [1:] gültig sind Sequenzen mit 2 Elementen.

csv.reader() gibt jede Zeile der CSV als Liste der Zeichenfolgen zurück. Es ist also eine gültige Sequenz. Wenn der CSV 2 Spalten hat, wird die Liste 2 Elemente haben. Standardmäßig verwendet csv.reader ein Komma als Trennzeichen zum Aufteilen.Sie können ein anderes Trennzeichen angeben, falls erforderlich:

csv.reader(csv_file, delimiter='|') 

Für jeden Aufruf von Python, sys.argv ist automatisch eine Liste von Strings, die die Argumente darstellen, die auf der Kommandozeile (durch Leerzeichen getrennt). Also wieder eine gültige Sequenz. argv [0] ist immer der Skriptname. Wenn also der Benutzer das Programm mit 2 Argumenten ausführt, wäre ein Benutzername gefolgt von einem Passwort sys.argv [1:] eine Liste von 2 Elementen wie erforderlich. Diese

-1

Auf der linken Seite gibt es eine TUPLE von Variablen und auf der rechten Seite gibt es eine Liste von Werten. Jede Variable erhält den entsprechenden Wert. Also hat diese Methode nichts mit Strings und mit irgendeinem Werttrennzeichen zu tun. Das Schlüsselwort ist LIST (s).

Wie für die CSV-Datei, können Sie die Informationen von pydoc csv bei der Definition von Leser() erhalten:

reader(...) 
    csv_reader = reader(iterable [, dialect='excel'] 
          [optional keyword args]) 
     for row in csv_reader: 
      process(row) 

    The "iterable" argument can be any object that returns a line 
    of input for each iteration, such as a file object or a list. The 
    optional "dialect" parameter is discussed below. The function 
    also accepts optional keyword arguments which override settings 
    provided by the dialect 

.

+1

Dies ist keine Liste, sondern eine Tupeldefinition, die nicht von Klammern umgeben ist. Siehe den Link von oben. –

+0

Während Sie Recht haben, glaube ich nicht, dass Curran an der Position ist, wo er/sie den (leichten) Unterschied zwischen Listen und Tupeln kennen/wissen kann/muss. –

+1

Genauer gesagt Zeile ist eine Liste, die, wenn es 2 Werte hat, diese beiden Werte auf die beiden Werte eines Tupels kopiert, in diesem Fall sind dies die Variablen k und v. –

1

arbeitet aus dem gleichen Grund das funktioniert:

a, b = [1, 2] 

Welche a-1 und b-2 zuweist.

Dies gilt für CSV-Reader, da Ihre Datei zwei Spalten haben muss und die erste Variable der ersten Spalte dieser Zeile und die zweite Variable der zweiten Spalte zugewiesen wird. Der Leser gibt eine Liste wie oben, so dass, warum es funktioniert :)

0

Grundsätzlich csv reader Rückkehr in jeder Zeile als list

Jetzt eine Liste übernehmen a=[1,2,3] ist, wenn Sie die Liste entpacken möchten durch die Zuweisung sollte

sein
a1,a2,a3 = a 

und der Auspackstation Wert wird so an die variable

a1=1 a2=2 a3=3

zuweisen

the number left side assignment variable should be the equal of length of list.

, wenn die Anzahl der Variablen und Listenlänge ungleich, als Sie einen Fehler erhalten

ValueError: too many values to unpack

Und die Liste wird den Wert, wie es der Index entpacken und weisen Sie nach rechts Variable links.

Kommen wir nun zur Sache. in csv reader die Zeile ist list type und die length dieser Liste ist die Nummer csv Dateispalte. Wenn Sie es auspacken, müssen Sie daran denken, die Nummer der Zuweisungsvariablen anzugeben.

Und eine andere sys.argv[] geben auch eine Liste zurück.

Und schließlich csv Datei Trennzeichen sind comma(,) und Befehl Parameterparser Begrenzer ist space (ein/mehrere), aber nach dem Parsen sie beide ein list zurück. Also müssen wir über die Liste nachdenken, wenn wir versuchen, es ass Assembly Variable zu entpacken.

Verwandte Themen