Ich muss eine zirkuläre Liste durchlaufen, möglicherweise viele Male, jedes Mal beginnend mit dem zuletzt besuchten Element.
Der Anwendungsfall ist ein Verbindungspool. Ein Client fragt nach einer Verbindung, ein Iterator prüft, ob eine Verbindung verfügbar ist, und gibt sie zurück. Andernfalls wird eine Schleife ausgeführt, bis eine verfügbare gefunden wird.
Gibt es eine gute Möglichkeit, dies in Python zu tun?
pool.next()
, um das nächste einzelne Element aus dem Zyklus zu erhaltennext(iterator)
(was übrigens auch unter Python 2.x gut funktioniert und daher die kanonische Form ist, die verwendet werden sollte). Siehe Ist generator.next () in Python 3.0 sichtbar? für eine ausführlichere Erklärung. Meine Antwort wurde entsprechend aktualisiert.Die richtige Antwort ist die Verwendung von itertools.cycle . Nehmen wir jedoch an, dass die Bibliotheksfunktion nicht vorhanden ist. Wie würden Sie es implementieren?
Verwenden Sie einen Generator :
Dann können Sie entweder eine
for
Anweisung verwenden, um unendlich zu iterieren, oder Sie können aufrufennext()
, um den einzelnen nächsten Wert vom Generator-Iterator abzurufen:quelle
while True
Mittel, um für immer zu wiederholenitertools.cycle
ist eine bessere Antwort. Dies zeigt, wie Sie die gleiche Funktionalität schreiben können, wenn sieitertools
nicht verfügbar ist :)itertools.cycle
? Oder wäre der einfache Generator ein speichereffizienteres Design?cycle
Note, this member of the toolkit may require significant auxiliary storage (depending on the length of the iterable).
cycle
impliziert, dass die iterierbare Eingabelist
vor dem Start des Generators konvertiert wird , da diesiterable
nur "gut für einen Durchgang über den Wertesatz" ist.Oder Sie können so tun:
druckt abcdefab c ... für immer
quelle
Sie können dies mit
append(pop())
Schleife erreichen:oder
for i in range()
Schleife:oder einfach:
alle davon drucken:
Von den dreien wäre ich anfällig für den Ansatz append (pop ()) als Funktion
quelle
Sie benötigen einen benutzerdefinierten Iterator - ich werde den Iterator aus dieser Antwort anpassen .
quelle
Wenn Sie Zykluszeiten möchten
n
, implementieren Sie dasncycles
itertools-Rezept :quelle