在Python中使用While循环分配?

Meh*_*dad 59 python variable-assignment while-loop

我刚看到这段代码

while 1:
    line = data.readline()
    if not line:
        break
    #...
Run Code Online (Sandbox Code Playgroud)

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

所以我尝试过:

while line = data.readline():
    #...
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

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

小智 40

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

for line in iter(data.readline, b''):
Run Code Online (Sandbox Code Playgroud)

  • +1在python核心文档中举例说明:https://docs.python.org/2/library/functions.html#iter (3认同)

Ned*_*der 25

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

for line in data:
    ... do stuff ...
Run Code Online (Sandbox Code Playgroud)


dfb*_*dfb 16

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

line = data.readline()
while line:
    # ... do stuff ... 
    line = data.readline()
Run Code Online (Sandbox Code Playgroud)

  • 我不是那个人的忠实粉丝,特别是如果`......做的东西......'相当大,因为它要求你在整个循环中记住整个循环的流量.例如,如果你添加类似`if line.startswith('foo'):continue`之后没有意识到`line`只在最后更新,那么你不小心创建了一个无限循环. (6认同)

Xav*_*hot 14

从开始Python 3.8,并引入赋值表达式(PEP 572):=运算符),现在可以data.readline()将while循环的条件值()捕获为变量(line),以便在循环体内重复使用它:

while line := data.readline():
  do_smthg(line)
Run Code Online (Sandbox Code Playgroud)

  • 作为旁注,显式条件可以写为“while (line := data.readline()) is not None:” (4认同)

Kir*_*ser 6

喜欢,

for line in data:
    # ...
Run Code Online (Sandbox Code Playgroud)

?它很大程度上取决于data对象的readline语义的语义.如果data是一个file对象,那就行了.


she*_*mer 5

for line in data:
    ... process line somehow....
Run Code Online (Sandbox Code Playgroud)

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

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


Ric*_*h L 5

从 python 3.8(实现PEP-572)开始,此代码现在有效:

while line := data.readline():
   # do something with line 
Run Code Online (Sandbox Code Playgroud)