这个 yield 在这个生成器中是如何工作的?

How does this yield work in this generator?

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 检查?

是的,它将在函数在下一次迭代中恢复时执行。请记住,yield 就像是生成器的暂停按钮,生成器通常在循环中使用。收益率是排序的 returning一个值(我说"sort of",因为yieldreturn不一样),但是当下次访问生成器时,它将在同一位置接收。 block = [] 的目的是在下一次循环之前将块重置为空列表(使用 block.clear() 可能会更快)。

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

yield 生成生成器的下一个输出,然后让它继续生成值。

在这里,行被读入一个块(行列表)。每当一个块填充了足够多的行时,它就会作为生成器的下一个值产生,然后该块被重新初始化为一个空列表,并且可以继续读取。