此产量如何在此生成器中起作用?

问题描述 投票:1回答:2
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检查?

python
2个回答
1
投票
是,它将在下一次迭代中恢复该函数时执行。请记住,yield就像生成器的暂停按钮一样,并且生成器通常在循环内使用。产量是

sort of返回一个值(我说“ sort of”,因为yieldreturn不同),但是当下一次访问生成器时,它将在同一位置拾取。 block = []的目的是在下一次执行操作之前将块重置为空列表(代替使用block.clear()可能会更快)。

此代码正在从文件中构建块,并在它们足够大后立即将它们交还给调用方。如果还有一些残缺不完整的块,则最后一个if块将返回最后一位。

0
投票
[yield产生发生器的下一个输出,然后允许它继续产生值。

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

© www.soinside.com 2019 - 2024. All rights reserved.