在Python中使用While循环分配?

时间:2011-07-08 22:16:06

标签: python while-loop variable-assignment

我刚刚遇到这段代码

while 1:
    line = data.readline()
    if not line:
        break
    #...

并认为,与使用break的无限循环相比,必须才能做到这一点。

所以我试过了:

while line = data.readline():
    #...

并且显然出现了错误。

有没有办法避免在这种情况下使用break

编辑:

理想情况下,你想避免两次说readline ...恕我直言,重复甚至比break更糟糕,特别是如果声明很复杂。

11 个答案:

答案 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语义的语义。如果datafile对象,那就可以了。

答案 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