python - 这个产量如何在这个生成器中工作?
问题描述
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有点返回一个值(我说“有点”,因为yield
与 不同return
),但是当下次访问生成器时,它将在同一个位置拾取。的目的block = []
是在下一次之前将块重置为空列表(使用它可能会更快block.clear()
)。
此代码正在从文件中构建块,并在它们足够大时将它们交还给调用者。if
如果有一些剩余部分不适合完整的块,则最后一个块将返回最后一位。
推荐阅读
- vba - 将每个数组项输出到文本框中的行中
- java - 从满足条件的数组中获取随机对象
- scala - sbt 错误:对象 spark 不是包 org.apache 的成员
- java - 使用 Java Spring Framework 连接到 SQL Server 时出错 - 无法加载 JDBC 驱动程序类
- mysql - 在内部连接中迭代地使用 MySQL LAG()
- odoo - 我有一个 many2many 表,但我需要提供域,因为只有模型中的合作伙伴记录需要显示在 many2many 表中
- git - Git extensions not working in VSCode for only one project
- python - 如何在cvxpy中写日志函数的透视图?
- python-3.x - 在显式子类型构造期间未调用 typing.Protocol 类 `__init__` 方法
- hana - HANA 将 JS 数组作为参数值绑定到 WHERE IN(...) 子句