Python for循环——它到底做什么

Python for循环——它到底做什么,python,python-2.7,Python,Python 2.7,我试图学习python,并遇到以下代码片段 f = open('test.txt') for line in f: print line 它逐行打印我文件中的内容 我理解for loop的基本概念:for x in list当list是一个列表时,它将遍历列表中的所有元素。我的问题是,f是一个文件对象,而不是一个列表,为什么for循环神奇地理解文件中有行并逐个处理 如果有人能在上面的代码中解释for循环到底发生了什么,那将非常有帮助。谢谢 文件对象支持迭代器协议 当文件用作迭代器时(通

我试图学习python,并遇到以下代码片段

f = open('test.txt')
for line in f:
    print line
它逐行打印我文件中的内容

我理解for loop的基本概念:
for x in list
list
是一个列表时,它将遍历列表中的所有元素。我的问题是,
f
是一个文件对象,而不是一个列表,为什么for循环神奇地理解文件中有行并逐个处理


如果有人能在上面的代码中解释for循环到底发生了什么,那将非常有帮助。谢谢

文件对象支持迭代器协议

当文件用作迭代器时(通常在for循环中),会重复调用
next()
方法


请参阅

任何对象都可以通过实现方法
\uuu iter\uuuu
为迭代提供接口,该方法必须返回迭代器。迭代器是提供一个
next
方法(Python 3中的
\uuuuuuuuuuuuuuuuuuuuuuu
以返回迭代中的下一个元素)的任何对象,以及一个返回迭代器本身的
\uuuuuuuuuuuuuu
方法(支持在
循环中直接使用迭代器)。在这种情况下,文件对象定义
\uuuu iter\uuu
以返回文件对象本身(因此文件对象是它们自己的迭代器),并定义
next
以返回文件中的下一行。

任何试图理解这一点的人都必须阅读:。它解释了类如何实现使其行为类似于内置的方法。具体地说,列表迭代器和文件句柄都支持,这是解释for循环在引擎盖下面做什么的要点。请注意,这实际上不是用Python实现的,而是用任何语言编写的解释器。所以,在CPython中使用C,或者在Jython中使用Java。因此,基本上,文件句柄实现了一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
(只返回self)和一个
\uuuuuuuuuu!Python不是很棒吗!其实我觉得是比较合适的复制品。无论如何,这是值得一读的公认答案。@wim你有一个金徽章,你能改变副本指向的链接吗?我让金獾决定。它们都是合适的,但在我看来,这个特殊的问题(尤其是标题)比具体的文件句柄更通用。迭代器和iterables是不同的。在python-2.7中,它是
next
,而不是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。iterable是使用iter方法返回iterable的对象。iterable实现一个
\uuuuuuuuuuuu
方法,但没有
\uuuuuuuuuuuuu
方法。迭代器有
\uuuuu iter\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
(可能只返回self)和
\uuuuuuuuuuuuuu。例如,iterable中的
范围(10)
。对其调用
iter
,将返回一个迭代器<代码>r=范围(10);it=iter(r)
。注意,如果我执行
next(r)
,解释器会抱怨
TypeError:“range”对象不是迭代器。但是如果我下一步(it)
,我会得到下一个值!我应该注意到,我上面的评论是用Python3来表达的,在Python3中,
next
方法已经变成了一个“dunder”
\uuuuuuuuu
方法。