Muszę powtarzać listę cykliczną, możliwie wiele razy, za każdym razem zaczynając od ostatnio odwiedzanego elementu.
Przypadek użycia to pula połączeń. Klient prosi o połączenie, iterator sprawdza, czy wskazane połączenie jest dostępne i zwraca je, w przeciwnym razie wykonuje pętlę, dopóki nie znajdzie takiego, które jest dostępne.
Czy jest na to zgrabny sposób w Pythonie?
pool.next()
aby uzyskać kolejny pojedynczy element z cyklunext(iterator)
(który BTW działa również dobrze w Pythonie 2.x, a zatem jest to forma kanoniczna, której należy użyć). Zobacz Czy generator.next () jest widoczny w Pythonie 3.0? aby uzyskać bardziej szczegółowe wyjaśnienie. Odpowiednio zaktualizowałem moją odpowiedź.Prawidłowa odpowiedź to użycie itertools.cycle . Ale załóżmy, że funkcja biblioteki nie istnieje. Jak byś to zaimplementował?
Użyj generatora :
Następnie możesz użyć
for
instrukcji, aby iterować w nieskończoność, lub możesz wywołać,next()
aby uzyskać pojedynczą następną wartość z iteratora generatora:źródło
while True
sposób na wieczne powtarzanieitertools.cycle
to lepsza odpowiedź. To pokazuje, jak możesz napisać tę samą funkcjonalność, jeśliitertools
nie jest dostępna :)itertools.cycle
robi? A może prosty generator byłby bardziej wydajną pamięcią? Zgodnie zcycle
dokumentami :Note, this member of the toolkit may require significant auxiliary storage (depending on the length of the iterable).
cycle
zakłada, że wejście iterowalne jest konwertowane na wejścielist
przed uruchomieniem jego generatora, ponieważiterable
jest „dobre tylko dla jednego przejścia przez zbiór wartości”.Lub możesz to zrobić:
wypisuje abcdefab c ... na zawsze
źródło
możesz to osiągnąć za pomocą
append(pop())
pętli:lub
for i in range()
pętla:lub po prostu:
z których wszystkie drukują:
z tych trzech byłbym podatny na podejście append (pop ()) jako funkcję
źródło
Potrzebujesz niestandardowego iteratora - dostosuję iterator na podstawie tej odpowiedzi .
źródło
Jeśli chcesz zmieniać
n
czasy cykli , zastosujncycles
przepis itertools :źródło