【问题标题】:How does this yield work in this generator?这个产量如何在这个生成器中工作?
【发布时间】:2020-05-25 12:00:24
【问题描述】:
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 是一种暂停执行并从下一行重新开始执行的方法。放置一个打印语句来检查它是否被执行。
  • 通过在你的函数中添加yield,这个函数就变成了一个生成器函数。详情可以查看here
  • 顺便说一句,该函数仅在大小恰好为block_size 时才会产生。使用if len(block) >= block_size: 可能会更好。

标签: python generator yield


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-18
      • 2012-07-08
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 2012-08-17
      • 2020-01-31
      相关资源
      最近更新 更多