来自python的for/while循环是一个生成器

San*_*jay 5 python yield generator

在一次采访中,采访者问我在Python中使用了一些生成器.我知道生成器就像一个函数而yield不是return.

所以任何人都告诉我for/ whileloop是发电机的一个例子.

PM *_*ing 5

它们本身既不是生成器while也不for是迭代器.它们是执行迭代的控制构造.当然,您可以使用forwhile迭代生成器生成的项目,并且可以使用forwhile在生成器的代码内执行迭代.但这些事实都不是制造者forwhile发电者.


Wil*_*sem 5

简答:,但还有其他形式的发电机.

for/ while循环是一个循环结构:它不发射值,因此不是一台发电机.

然而,还有其他方法来构建生成器.

你的例子yield是例如一个生成器:

def some_generator(xs):
    for x in xs:
        if x:
            yield x
Run Code Online (Sandbox Code Playgroud)

但也有生成器表达式,如:

(x for x in xs if x)
Run Code Online (Sandbox Code Playgroud)

此外,在range(..),map(..),filter(..)结构是发电机为好.

当然,您可以进行迭代(通过使用可迭代模式):

class some_generator(object):
    def __init__(self, xs):
        self.n = n
        self.idx = 0

    def __iter__(self):
        return self

    def __next__(self):
        return self.next()

    def next(self):
        while self.num < len(self.xs) and not self.xs[self.num]:
            self.num += 1
        if self.num < len(self.xs):
            res = self.xs[self.num]
            self.num += 1
            return res
        else:
            raise StopIteration()
Run Code Online (Sandbox Code Playgroud)