эмулируя встроенную функцию цикла - PullRequest
0 голосов
/ 18 октября 2019

Я создал следующую функцию эмулятора для itertools.cycle в python.

def cycle1(s) :
   while True :
       for i in s :  
           yield i

Однако я не уверен, почему следующее вызывает синтаксическую ошибку:

def cycle2(s) :
   return (i for i in s while True)

Почему я не могу использовать в то время как в понимании списка? Как я могу иметь бесконечный цикл в понимании списка?

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Почему я не могу использовать while в [синтаксисе для пониманий и выражений генератора]?

Это просто не определено для работы таким образом. Может быть, будущая версия может поддержать его, если есть четкое предложение (PEP) и достаточный спрос.

Как я могу иметь бесконечный цикл в пределах понимания списка?

с предложением for, которое зацикливается на каком-то неограниченном генераторе. itertools предоставляет пару из них: count (производит бесконечные увеличивающиеся числа) и repeat (продолжает давать одно и то же значение, если не указан явный счет). Кроме того, вы можете создать его самостоятельно из встроенного iter:

>>> help(iter)
Help on built-in function iter in module builtins:

iter(...)
    iter(iterable) -> iterator
    iter(callable, sentinel) -> iterator

    Get an iterator from an object.  In the first form, the argument must
    supply its own iterator, or be a sequence.
    In the second form, the callable is called until it returns the sentinel.

Первая версия явно не помогает, но для второй все, что нам нужно, это вызываемый элемент, который возвращает некоторое значение,и значение часового, которое является другим значением. Например, iter(lambda: True, False).

0 голосов
/ 18 октября 2019

Это вызывает ошибку, потому что этот синтаксис не определен в Python! Вы можете попробовать:

class MyGenerator:
    def __init__(self,s):
        self.s = s
        self._ix = None

    def __iter__(self):
        return self

    def __next__(self):
        if self._ix is None:
            self._ix = 0

        self._ix = (self._ix + 1) % self.s
        return self._ix

g = MyGenerator(5)

for i in range(20):
    print(next(g))
...