Dokumentacja itertools.cycle Pythona() daje wdrażanie pseudo-kod jako:Dlaczego itertools.crypt Pythona musi utworzyć kopię pliku iterable?
def cycle(iterable):
# cycle('ABCD') --> A B C D A B C D A B C D ...
saved = []
for element in iterable:
yield element
saved.append(element)
while saved:
for element in saved:
yield element
poniżej, stwierdza: „Uwaga, to członek Toolkit może wymagać znaczącego pamięci dyskowej (w zależności od długości iterable). "
I w zasadzie szło tą drogą, z wyjątkiem Zrobiłem to, co nie wymaga tworzenia kopię iterable:
def loop(iterable):
it = iterable.__iter__()
while True:
try:
yield it.next()
except StopIteration:
it = iterable.__iter__()
yield it.next()
x = {1, 2, 3}
hard_limit = 6
for i in loop(x):
if hard_limit <= 0:
break
print i
hard_limit -= 1
drukuje:
1
2
3
1
2
3
Tak, zdaję sobie sprawę, moje wykonanie nie działałby dla strs, ale można by to zrobić. Jestem bardziej ciekawy, dlaczego tworzy kolejną kopię. Mam wrażenie, że ma to związek ze zbieraniem śmieci, ale nie jestem dobrze zbadany w tym obszarze Pythona.
Dzięki!
@Martijn jak dodałeś podświetlanie składni? Nie mogłem wymyślić, jak to zrobić ... – stantonk
Nie zrobiłem tego; Dodałem tag 'python', a następnie podświetlanie zostanie zastosowane automatycznie. Ale nawet bez podświetlania znacznika jest często dokładnie zgadywana. –
Ahhh, ale tag python2.7 nie? dziwne ... – stantonk