假设您具有复杂的代码,该代码通过从空白列表开始并重复添加到列表中来创建并返回列表:
def create(): result = [] # 逻辑在这里... result.append(value) # 可能在几个地方 # 更多逻辑... return result # 可能在几个地方 values = create()
当用列表推导替换内部逻辑不可行时,可以将整个函数转换为就地生成器,然后收集结果:
def create_gen(): # 逻辑... yield value # 更多逻辑 return # 当然,如果在函数末尾不需要 values = list(create_gen())
如果逻辑是递归的,则用于yield from将来自递归调用的所有值包括在“扁平化”结果中:
def preorder_traversal(node): yield node.value for child in node.children: yield from preorder_traversal(child)