San*_*jay 5 python yield generator
在一次采访中,采访者问我在Python中使用了一些生成器.我知道生成器就像一个函数而yield不是return.
所以任何人都告诉我for/ whileloop是发电机的一个例子.
它们本身既不是生成器while也不for是迭代器.它们是执行迭代的控制构造.当然,您可以使用for或while迭代生成器生成的项目,并且可以使用for或while在生成器的代码内执行迭代.但这些事实都不是制造者for或while发电者.
简答:不,但还有其他形式的发电机.
阿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)
此外,在蟒蛇-3.X的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)