我刚看到这段代码
while 1:
line = data.readline()
if not line:
break
#...
并且认为,必须有一个更好的方法来做到这一点,而不是使用break
的无限循环。
所以我尝试过:
while line = data.readline():
#...
并且,显然,有一个错误。
有没有办法避免在那种情况下使用break
?
理想情况下,你想避免两次说readline
...恕我直言,重复甚至比只是一个break
更糟糕,特别是如果声明很复杂。
如果您没有对数据做任何更好的事情,比如稍后阅读更多行,总会有:
for line in data:
... do stuff ...
启动Python 3.8
,并引入assignment expressions (PEP 572)(:=
运算符),现在可以将while循环的条件值(data.readline()
)捕获为变量(line
),以便在循环体内重用它:
while line := data.readline():
do_smthg(line)
尝试这个,适用于使用open('filename')
打开的文件
for line in iter(data.readline, b''):
这不是更好,但这是我通常这样做的方式。 Python不像其他语言(例如Java)那样在变量赋值时返回值。
line = data.readline()
while line:
# ... do stuff ...
line = data.readline()
喜欢,
for line in data:
# ...
?它很大程度上取决于data
对象的readline语义的语义。如果data
是file
对象,那就行了。
for line in data:
... process line somehow....
将迭代file
中的每一行,而不是使用while
。根据我的经验(在Python中)读取文件的任务是一个更常见的习惯用法。
事实上,data
不一定是一个文件,而只是提供一个迭代器。
你可以这样做:
line = 1
while line:
line = data.readline()
如果data
是一个文件,如其他答案所述,使用for line in file
将正常工作。如果数据不是文件和随机数据读取对象,那么您应该将其实现为迭代器,实现__iter__
和next
方法。
next
方法应该读取,检查是否有更多数据,如果没有,提高StopIteration
。如果你这样做,你可以继续使用for line in data
成语。
根据Python文档中的FAQ,使用for
构造迭代输入或运行无限while True
循环并使用break
语句来终止它,是首选和惯用的迭代方法。
如果data
有一个返回迭代器而不是readline
(比如data.iterate
)的函数,你可以简单地做:
for line in data.iterate():
#...