假设我有以下代码:
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进入函数代码,就停止正常调用。这样的事情。