gpt4 book ai didi

Python 生成器和文件对象

转载 作者:太空宇宙 更新时间:2023-11-03 15:06:30 25 4
gpt4 key购买 nike

我有一个关于生成器和文件对象的问题。

如果我写代码

def iter(ls):
count=0
for k in ls:
if count==2:
break
count+=1
for k in ls:
yield k

test=[1,2,3,4]

k=iter(test)
for i in k:
print i

那么输出就是

1 2 3 4

是的,我能理解这一点,因为这段代码中的 break 语句不会影响后面的 yield 语句。

但是如果我对文件做类似的事情,在这种情况下,我会创建一个“数据”文件并将其写入

1
2
3
4

如果我只改变线路

test=[1,2,3,4]  →  test=open("data","r")

那么结果就是

4

这意味着 break 语句在某种程度上有所影响,因此在包含“yield”的 for 循环中生成的生成器与之前的情况不同。

造成这种差异的原因是什么?

最佳答案

是的,因为文件对象还存储它当前读取到的位置。因此,当您尝试再次遍历文件对象时(不执行 .seek() ),它将从下一行(您离开的地方)开始。那是在打开一个文件并迭代一次之后,如果您尝试再次迭代它(不执行 .seek()),它不会产生任何结果,因为在第一次迭代本身光标位于文件末尾,没有其他内容可读。示例 -

我的 a.txt -

1
2
3
4

代码-

>>> for i in f:
... print(i)
...
1

2

3

4
>>> for i in f:
... print(i)
...
>>>

--

如上所示,如果要将文件光标移动到文件开头,则必须使用 file.seek(0) ,0 表示移动起始位置。

关于Python 生成器和文件对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32027086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com