Python while 循环中的赋值条件
在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...