假设我有以下代码:
def channel(*names):
for i in names:
yield channels[i]
print(channel('ru', 'rul'))
我计划channel
它会返回给我[channel['ru'], channel['rul']]
,但是生成器对象返回了。请解释一下如何立即获取生成器列表?
我不能使用生成器,而只能使用变量 和.append()
,但我了解了一个可以放入一行的生成器。
假设我有以下代码:
def channel(*names):
for i in names:
yield channels[i]
print(channel('ru', 'rul'))
我计划channel
它会返回给我[channel['ru'], channel['rul']]
,但是生成器对象返回了。请解释一下如何立即获取生成器列表?
我不能使用生成器,而只能使用变量 和.append()
,但我了解了一个可以放入一行的生成器。
yield
创建一个生成器函数(在其他语言中也称为迭代器)。生成器具有当前元素和移动到下一个元素的函数。例如,可以使用for
、拆箱以及任何其他迭代器固有的其他操作来遍历它:如果您希望结果自动包装在列表中(我强烈不推荐),您可以使用装饰器:
yield
函数体内从根本上改变了它的行为:如果主体中有一个函数
yield
并且您调用该函数,则不会调用该函数并且不会执行其主体。相反,创建一个“生成器”对象来存储函数及其参数的值。要开始执行函数体,您需要调用
__next__
.此时,函数体将开始执行,并在 后停止yield
。要继续执行,需要再次调用__next__
。函数体将继续执行,直到下一个函数体yield
。在正常代码中
__next__
没有调用。每个人都调用全局函数next
或将“生成器”放入循环中(for v in g():
)或将生成器传递给从中提取值的函数(list
,tuple
)。所以你需要类似的东西
print(list(channel('ru', 'rul')))
。PS这种行为
yield
会导致令人惊讶的错误。你有两个屏幕的功能。有一天你调用它,但它没有被调用,调试器没有进入内部。为什么?一次不成功的合并将她的身体与下面的发电机的身体合并在一起,其中包含yield
。一旦yield
进入函数代码,就停止正常调用。这样的事情。