首页 > 解决方案 > 这个产量如何在这个生成器中工作?

问题描述

def read_large_file(file_handler, block_size=10000):
    block = []
    for line in file_handler:
        block.append(line)
        if len(block) == block_size:
            yield block
            block = []

    # don't forget to yield the last block
    if block:
        yield block

with open(path) as file_handler:
    for block in read_large_file(file_handler):
        print(block)

我正在阅读上面由另一个人编写的这段代码。对于这一行:

if len(block) == block_size:
   yield block
   block = []

block=[]有机会被执行吗?我曾以为yield就像是一个return声明。另外,为什么要if block检查?

标签: pythongeneratoryield

解决方案


是的,它将在函数在下一次迭代中恢复时执行。请记住,yield 就像生成器的暂停按钮,生成器通常在循环中使用。yield有点返回一个值(我说“有点”,因为yield与 不同return),但是当下次访问生成器时,它将在同一个位置拾取。的目的block = []是在下一次之前将块重置为空列表(使用它可能会更快block.clear())。

此代码正在从文件中构建块,并在它们足够大时将它们交还给调用者。if如果有一些剩余部分不适合完整的块,则最后一个块将返回最后一位。


推荐阅读