模拟内置循环功能

问题描述 投票:0回答:2

我已经在python中为itertools.cycle创建了以下仿真器功能。

def cycle1(s):而True:为我在s:让我

但是,我不确定为什么以下内容会产生语法错误:

def cycle2(s):返回(i为,而s为True)

为什么在理解列表时不能使用?如何在列表理解中产生无限循环?

谢谢。

python generator itertools
2个回答
0
投票

这会引发错误,因为该语法未在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))

0
投票

为什么我不能在[理解和生成器表达式的语法]中使用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)

© www.soinside.com 2019 - 2024. All rights reserved.