Я хотел бы знать, в чем основные различия между этими двумя ...
Основное отличие состоит в том, что эти фрагменты кода не полностью эквивалентны в поведении. Используя cycle
, вы можете принять и повторить исчерпывающий итератор, тогда как цикл while
не может.
>>> def gen():
... yield 1
... yield 2
...
>>> def loop_it(it):
... for element in itertools.cycle(it):
... yield element
...
>>> g = loop_it(gen())
>>> next(g)
1
>>> next(g)
2
>>> next(g)
1
Контрастность:
>>> def loop_while(it):
... while True:
... for element in it:
... yield element
...
>>> g = loop_while(gen())
>>> next(g)
1
>>> next(g)
2
>>> next(g)
# ... hangs forever
... и если есть более "питонический" способ написать что-нибудь простое, как это
Моя рекомендация для цикла while
, в точности как написано. Если в школьном задании вас попросят написать генератор, он, вероятно, будет осужден за использование "подготовленного ранее" из itertools. Петля while
также более Pythonic. Вместо этого, «itertoolsthonic» подход будет использовать цикл напрямую, например:
items = itertools.cycle(l)
# do something with `items`
Нет смысла писать дополнительные подпрограммы функции-генератора и для циклической выдачи из itertools.cycle
- поскольку цикл уже является итератором, вы просто использовали бы его напрямую.