Verschachtelte For-Schleife, Python-Version 2.3 vs. 2.6

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
frank_b
User
Beiträge: 7
Registriert: Mittwoch 4. Mai 2011, 11:07

Hallo zusammen,

vielleicht habt Ihr eine Idee: Ich habe bisher mit Python 2.6 gearbeitet. Nun funktioniert mein Programm unter Python 2.3 nicht mehr.
Diese Zeile hier bringt Syntax-Error unter Python 2.3:

Code: Alles auswählen

for link in (links.pop(0) for _ in xrange(len(links)):
Wie kann ich sie am besten 2.3-freundlich umschreiben? Danke!
Frank
deets

Whoa, das ist ja mal ein kleines fieses Stueckchen code... ;) Das wuerde ich ehrlich gesagt grundsaetzlich umschreiben, und zwar so:

Code: Alles auswählen

for link in links:
     ...
links[:] = []
Wichtig dabei natuerlich, dass innerhalb des von dir nicht gezeigten Blockes nix mit "links" passiert. Aber das waere dann *noch* ein Fall fuer ein Refactoring :)
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

Hallo Frank,

In der Zeile ist ja auch ein Syntax Fehler. Die Anzahl der Klammern ist ungerade.
lunar

@frank_b: Python 2.3 unterstützt keine Generator-Ausdrücke.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

Äquivalent zu deinem Code ist es nicht, aber vermutlich ist es ausreichend ähnlich:

Code: Alles auswählen

for i in xrange(len(links)):
  link = links.pop(0)
  ...
frank_b
User
Beiträge: 7
Registriert: Mittwoch 4. Mai 2011, 11:07

@Boa Danke, das ist es!
BlackJack

Ich möchte mich da deets noch mal anschliessen. Das mag jetzt zwar ein Äquivalent sein, aber beides sieht gleich unschön aus. Ist es denn wirklich notwendig, dass die Liste innerhalb der Schleife verändert wird? Und dann auch noch *so*!? Da sieht die Liste einfach falsch gewählt aus.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

@BlackJack: So ist es etwas ästhetischer:

Code: Alles auswählen

while links:
  link = links.pop(0)
  ... 
Dass eine Liste in einer Schleife geändert wird ist ein Normalfall und scheint mir nicht unschön. Zumindest solange die Änderung der Liste in einer for-Schleife nicht die Anzahl der Iterationen verändert, was hier aber nicht der Fall ist.
lunar

@Boa: Es ist meist schöner, eine Liste zu kopieren anstatt eine existierende Liste zu verändern.
BlackJack

@Boa: Das die Liste über die iteriert wird, innerhalb der Schleife verändert wird, ist ganz bestimmt nicht der Normalfall und IMHO unschön. Zusätzlich noch das die Liste *so* verändert wird, wie das hier der Fall ist. Wiederholt alle Elemente einer Liste von vorne entfernen ist ineffizient. Dafür ist eine Liste in Python eine unpassende Datenstruktur. Man verwendet nicht ohne Not einen Ansatz mit einem quadratischen Zeitbedarf, wenn es auch linear ginge. Wenn die Veränderung der Liste immer mit einer leeren Liste endet, dann kann man, wie deets das auch getan hat, fragen warum die überhaupt verändert wird. Eine Liste zu leeren und unbedingt wiederverwenden zu wollen ist ebenfalls nicht üblich. Da nimmt man normalerweise einfach eine neue, leere Liste.
Antworten