在Python中的while循环条件中分配变量?

99

我刚刚看到了这段代码

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

而且我认为,除了使用带有 break 的无限循环之外,一定还有更好的方法来处理这个问题。

所以我尝试了以下方法:

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

而且,显然,出现了一个错误。

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

编辑:

理想情况下,您应该避免两次使用readline... 在我看来,重复甚至比仅使用break更糟,特别是如果语句很复杂。


3
虽然这是一个很好的问题,我认为 for line in data 的解决方案非常适合这个具体的问题,但我不认为使用 while True: ... break 这种方法有什么问题。不要害怕它。 :-) - Kirk Strauser
4
这些答案提供了在while循环的条件语句中替代赋值的方法,但并没有回答这个问题:是否有一种方法在while循环中进行赋值?我遇到了同样的问题,试图执行while (character = string[i]) :我 知道 for循环是迭代字符串更好的方法,但我的条件语句实际上比这更复杂,我想将此赋值作为条件语句中“或”运算符的右侧。 - user2760926
1
@KirkStrauser,使用break语句的问题在于它需要四行代码来表达其他语言只需一行就能完成的操作。但是它确实做了正确的事情。到目前为止,没有任何答案提供了更好的通用解决方案。它们要么只适用于迭代器,要么复制赋值,这比使用break语句多三行代码还要糟糕。 - kasperd
11个回答

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

1
除非您知道“data”是微小的(即使是这样也不建议这么做),因为“.readlines()”会将整个内容读入RAM,但实际上并没有任何好处。 - Kirk Strauser
如果函数返回一个迭代器而不是整个列表,那么它应该可以正常工作,对吗? - TorelTwiddler
是的,但我没有看到.readlines()以那种方式实现。file.readlines()的文档说它将“使用readline()读取直到EOF,并返回包含这样读取的行的列表。” - Kirk Strauser
我更喜欢那个答案 :-) ,不过 iterate 的通常名称是 __iter__,然后您可以将循环重写为 for line in data - Kirk Strauser
没错,但我会保留它,因为已经有其他4个答案使用了for line in data。=D - TorelTwiddler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接