这个 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",因为yield
和return
不一样),但是当下次访问生成器时,它将在同一位置接收。 block = []
的目的是在下一次循环之前将块重置为空列表(使用 block.clear()
可能会更快)。
此代码从文件构建块,并在它们足够大时将它们交还给调用者。最后一个 if
块到 return 最后一位,如果有一些剩余的不适合一个完整的块。
yield
生成生成器的下一个输出,然后让它继续生成值。
在这里,行被读入一个块(行列表)。每当一个块填充了足够多的行时,它就会作为生成器的下一个值产生,然后该块被重新初始化为一个空列表,并且可以继续读取。
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",因为yield
和return
不一样),但是当下次访问生成器时,它将在同一位置接收。 block = []
的目的是在下一次循环之前将块重置为空列表(使用 block.clear()
可能会更快)。
此代码从文件构建块,并在它们足够大时将它们交还给调用者。最后一个 if
块到 return 最后一位,如果有一些剩余的不适合一个完整的块。
yield
生成生成器的下一个输出,然后让它继续生成值。
在这里,行被读入一个块(行列表)。每当一个块填充了足够多的行时,它就会作为生成器的下一个值产生,然后该块被重新初始化为一个空列表,并且可以继续读取。