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
检查?
sort of返回一个值(我说“ sort of”,因为yield
与return
不同),但是当下一次访问生成器时,它将在同一位置拾取。 block = []
的目的是在下一次执行操作之前将块重置为空列表(代替使用block.clear()
可能会更快)。
if
块将返回最后一位。yield
产生发生器的下一个输出,然后允许它继续产生值。这里,将行读入一个块(行的列表)。每当用足够的行填充一个块时,它都会作为生成器的下一个值产生,然后将该块重新初始化为一个空列表,然后读取就可以继续。