我刚刚遇到这段代码
while 1:
line = data.readline()
if not line:
break
#...
并认为,与使用break
的无限循环相比,必须才能做到这一点。
所以我试过了:
while line = data.readline():
#...
并且显然出现了错误。
有没有办法避免在这种情况下使用break
?
理想情况下,你想避免两次说readline
...恕我直言,重复甚至比break
更糟糕,特别是如果声明很复杂。
答案 0 :(得分:38)
尝试使用此功能,适用于使用open('filename')
for line in iter(data.readline, b''):
答案 1 :(得分:25)
如果您没有对数据做任何更好的事情,比如稍后阅读更多行,总会有:
for line in data:
... do stuff ...
答案 2 :(得分:16)
这不是更好,但这是我通常这样做的方式。 Python不像其他语言(例如Java)那样在变量赋值时返回值。
line = data.readline()
while line:
# ... do stuff ...
line = data.readline()
答案 3 :(得分:6)
像,
for line in data:
# ...
?它很大程度上取决于data
对象的readline语义的语义。如果data
是file
对象,那就可以了。
答案 4 :(得分:4)
for line in data:
... process line somehow....
将迭代file
中的每一行,而不是使用while
。根据我的经验(在Python中)读取文件的任务是一种更常见的习惯用法。
实际上,data
不一定是文件,只是提供迭代器。
答案 5 :(得分:2)
你可以这样做:
line = 1
while line:
line = data.readline()
答案 6 :(得分:2)
如果data
是一个文件,如其他答案中所述,使用for line in file
将正常工作。如果数据不是文件和随机数据读取对象,那么您应该将其实现为迭代器,实现__iter__
和next
方法。
next
方法应该阅读,检查是否有更多数据,如果没有,请提升StopIteration
。如果您这样做,则可以继续使用for line in data
惯用法。
答案 7 :(得分:2)
根据Python文档中的FAQ,使用for
构造迭代输入或运行无限while True
循环并使用break
语句来终止它,是首选和习惯的迭代方式。
答案 8 :(得分:1)
如果data
有一个函数返回迭代器而不是readline
(比如说data.iterate
),你可以这样做:
for line in data.iterate():
#...
答案 9 :(得分:0)
从Skipping invalid Intl.message invocation
<Intl.message("MESSAGE")>
reason: The 'args' argument for Intl.message must be specified for messages with parameters. Consider using rewrite_intl_messages.dart
from lib/main.dart line: 125, column: 9
开始并引入assignment expressions (PEP 572)(The name and args parameters must match the name (or ClassName_methodName) and arguments list of the function respectively. For messages without parameters, both of these can be omitted.
运算符),现在可以将while循环的条件值(Python 3.8
)捕获为变量(:=
),以便在循环体内重复使用它:
data.readline()
答案 10 :(得分:0)
从python 3.8(实现PEP-572)开始,此代码现已有效:
while line := data.readline():
# do something with line