Python while 循环中的赋值条件

42 投票
5 回答
25493 浏览
提问于 2025-04-17 04:23

在C语言中,你可以这样做:

while( (i=a) != b ) { }

但是在Python中,似乎不可以。

while (i = sys.stdin.read(1)) != "\n":

这段代码会产生

    while (i = sys.stdin.read(1)) != "\n":
         ^
SyntaxError: invalid syntax

(这里的 ^ 应该放在 = 的旁边)

有没有什么解决办法呢?

5 个回答

9

你可以使用内置的 iter() 函数来实现这个功能,方法是用两个参数来调用它:

import functools
for i in iter(fuctools.partial(sys.stdin.read, 1), '\n'):
    ...

关于这个的说明:

iter(o[, sentinel])
...
如果你提供了第二个参数 sentinel,那么 o 必须是一个可以调用的对象。在这种情况下,创建的迭代器会在每次调用它的 next() 方法时,不带参数地调用 o;如果返回的值等于 sentinel,就会引发 StopIteration,否则就会返回这个值。

这种 iter() 的第二种用法很有用,比如可以用来读取文件的行,直到达到某一特定的行。下面的例子展示了如何读取文件,直到 readline() 方法返回一个空字符串:

with open('mydata.txt') as fp:
    for line in iter(fp.readline, ''):
        process_line(line)
42

Python 3.8 开始,引入了一个叫做 赋值表达式 (PEP 572) 的新特性,也就是 := 这个符号。这个新特性让我们可以在 while 循环里直接把一个表达式的结果(比如 sys.stdin.read(1))赋值给一个变量,这样就可以在循环体内使用这个变量了。

while (i := sys.stdin.read(1)) != '\n':
  do_smthg(i)

具体来说,这段代码:

  • sys.stdin.read(1) 的结果赋值给一个变量 i
  • 然后把 i\n(换行符)进行比较
  • 如果这个条件成立,就会进入 while 循环的主体,在这里可以使用 i 这个变量
27

使用 break:

while True:
    i = sys.stdin.read(1)
    if i == "\n":
       break
    # etc...

撰写回答