Ich habe versucht, eine grundlegende Spinning-Animation mit "\ | / -" zu erstellen, was gut ging, aber ich wollte zwei in derselben Aktualisierungszeile. Mit einer Drehung im Uhrzeigersinn und einer Drehung gegen den Uhrzeigersinn.

Folgendes habe ich mir ausgedacht:

animation_1 = ['\\', '|', '/', '-']
animation_2 = ['/', '|', '\\', '-']

while True:
    for iteration_1, iteration_2 in animation_1, animation_2:
        print(f'\r    {iteration_2}  {iteration_1}', end='')
        sleep(.5)
        sys.stdout.flush()

Welche bekommen die Ausgabe:

"Traceback (most recent call last):
  File "/Users/pungkrock/PycharmProjects/ans/fib.py", line 18, in <module>
    for iteration_1, iteration_2 in animation_1, animation_2:
ValueError: too many values to unpack (expected 2)"

Dieses Beispiel:

animation_1 = ['\\', '|', '/', '-']
animation_2 = ['/', '|', '\\', '-']

while True:
    for iteration_1, iteration_2 in animation_1:
        print(f'\r    {iteration_2}  {iteration_1}', end='')
        sleep(.5)
        sys.stdout.flush()

Ruft die Ausgabe ab:

"Traceback (most recent call last):
  File "/Users/pungkrock/PycharmProjects/ans/fib.py", line 18, in <module>
    for iteration_1, iteration_2 in animation_1:
ValueError: not enough values to unpack (expected 2, got 1)"

Und diese Fehlermassage verstehe ich. Aber ich verstehe nicht, warum ich vom ersten Beispiel eine Fehlermeldung bekomme.

Dieses Beispiel funktioniert gut:

animation_1 = ['\\', '|', '/', '-']
# animation_2 = ['/', '|', '\\', '-']

while True:
    for iteration_1 in animation_1:
        print(f'\r      {iteration_1}', end='')
        sleep(.5)
        sys.stdout.flush()

Kann mir eine freundliche Seele erklären, wie das erste Codebeispiel nicht funktioniert? Oder wenn mir ein grundlegendes Verständnis eines Sprachkonzepts fehlt? "zu viele Werte zum Auspacken (erwartete 2)", hat es 2 bekommen? Was vermisse ich?

2
Pungkrock 19 Feb. 2020 im 18:46

3 Antworten

Beste Antwort

in animation_1, animation_2 ist keine gültige Syntax

Ich nehme an, Sie möchten sie mit einem Reißverschluss schließen

for a1, a2 in zip(animation_1, animation_2)
0
cricket_007 19 Feb. 2020 im 16:10

Ich verstehe nicht, warum ich im ersten Beispiel eine Fehlermeldung erhalte.

OK, lass uns durchgehen. Die relevanten Teile sind, dass Sie zwei Listen mit der Länge 4 haben und dann versucht haben, beide mit so etwas zu durchlaufen:

a = [1, 2, 3, 4]
b = [5, 6, 7, 8]

for i, j in a, b:
    ...

Ich werde diesen Code als Beispiel verwenden, weil er etwas einfacher ist. Es gibt zwei wichtige Punkte:

  • a, b erstellt ein Tupel mit den beiden Listen. Es ist das gleiche, als ob Sie (a, b) geschrieben hätten.
  • for i, j in something funktioniert nur, wenn jedes Element von something eine Folge der Länge 2 ist.

Von dort aus ist es ganz einfach: Die Elemente des Tupels (a, b) sind einfach a und b selbst, die Sequenzen der Länge 4 sind, keine Sequenzen der Länge 2. Deshalb gibt es sie dort sind zu viele Werte zum Entpacken: 4 ist zu viele.

1
kaya3 20 Feb. 2020 im 00:17
>>> for x in range(4):
...   print(animation_1[x],animation_1[3-x])
...
\ -
| /
/ |
- \

Entschuldigung, keine Erklärung, ich bin auch neu in Python selbst .... 😁

0
Luuk 19 Feb. 2020 im 16:06