gpt4 book ai didi

python - 目标文件默认是一个列表吗?

转载 作者:太空狗 更新时间:2023-10-29 19:34:12 25 4
gpt4 key购买 nike

我遇到过两个版本的代码,它们都可以完成相同的任务,只是代码本身略有不同:

with open("file") as f:
for line in f:
print line

with open("file") as f:
data = f.readlines()
for line in data:
print line

我的问题是,文件对象 f 默认是一个列表,就像 data 一样吗?如果不是,为什么第一段代码有效?哪个版本是更好的做法?

最佳答案

File 对象不是 list - 它是符合 iterator 接口(interface) ( docs ) 的对象。 IE。它实现了返回 iterator 对象的 __iter__ 方法。 iterator 对象实现了 __iter__next 方法,允许对集合进行迭代。

碰巧 File 对象是它自己的迭代器 (docs),这意味着 file.__iter__() 返回 self

for line in filelines = file.readlines() 是等效的,因为如果用于获取/迭代 all,它们会产生相同的结果 文件中的行。 但是file.next() 缓冲文件中的内容(它提前读取)以加快读取过程,有效地将文件描述符移动到比最后一行结束的位置精确或更远的位置。这意味着如果您使用 for line in file,读取一些行并停止迭代(您还没有到达文件末尾),现在调用 file.readlines(),返回的第一行可能不是是在 for 循环中迭代的最后一行之后的完整行。

当您使用 for x in my_it 时,解释器会调用 my_it.__iter__()。现在,next() 方法在上一次调用返回的对象上被调用,并且对于每次调用,它的返回值被分配给 x。当 next() 引发 StopIteration 时,循环结束。

注意:一个有效的迭代器实现应该确保一旦 StopIteration 被引发,它应该在所有后续调用 next() .

关于python - 目标文件默认是一个列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19121451/

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