在Python中使用While循环分配?

问题描述 投票:54回答:10

我刚看到这段代码

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

并且认为,必须有一个更好的方法来做到这一点,而不是使用break的无限循环。

所以我尝试过:

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

并且,显然,有一个错误。

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

Edit:

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

python while-loop variable-assignment
10个回答
25
投票

如果您没有对数据做任何更好的事情,比如稍后阅读更多行,总会有:

for line in data:
    ... do stuff ...

1
投票

启动Python 3.8,并引入assignment expressions (PEP 572):=运算符),现在可以将while循环的条件值(data.readline())捕获为变量(line),以便在循环体内重用它:

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

39
投票

尝试这个,适用于使用open('filename')打开的文件

for line in iter(data.readline, b''):

16
投票

这不是更好,但这是我通常这样做的方式。 Python不像其他语言(例如Java)那样在变量赋值时返回值。

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

6
投票

喜欢,

for line in data:
    # ...

?它很大程度上取决于data对象的readline语义的语义。如果datafile对象,那就行了。


4
投票
for line in data:
    ... process line somehow....

将迭代file中的每一行,而不是使用while。根据我的经验(在Python中)读取文件的任务是一个更常见的习惯用法。

事实上,data不一定是一个文件,而只是提供一个迭代器。


2
投票

你可以这样做:

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

2
投票

如果data是一个文件,如其他答案所述,使用for line in file将正常工作。如果数据不是文件和随机数据读取对象,那么您应该将其实现为迭代器,实现__iter__next方法。

next方法应该读取,检查是否有更多数据,如果没有,提高StopIteration。如果你这样做,你可以继续使用for line in data成语。


2
投票

根据Python文档中的FAQ,使用for构造迭代输入或运行无限while True循环并使用break语句来终止它,是首选和惯用的迭代方法。


1
投票

如果data有一个返回迭代器而不是readline(比如data.iterate)的函数,你可以简单地做:

for line in data.iterate():
    #...
© www.soinside.com 2019 - 2024. All rights reserved.