Python循环时的赋值条件

时间:2011-10-15 22:12:40

标签: python loops while-loop conditional-statements

在C中,可以做到

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

但是在Python中,似乎没有。

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

产生

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

^应位于=

有解决方法吗?

5 个答案:

答案 0 :(得分:22)

使用break:

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

答案 1 :(得分:8)

您可以使用内置函数iter()使用双参数调用方法完成此操作:

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

此文档:

  

iter(o[, sentinel])
  ...
  如果给出第二个参数 sentinel ,则 o 必须是可调用对象。在这种情况下创建的迭代器将调用 o ,每次调用next()方法时都不带参数;如果返回的值等于 sentinel ,则会引发StopIteration,否则将返回该值。

     

第二种形式的iter()的一个有用的应用是读取文件的行直到达到某一行。以下示例读取文件,直到readline()方法返回空字符串:

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

答案 2 :(得分:6)

没有functools的版本:

for i in iter(lambda: sys.stdin.read(1), '\n'):

答案 3 :(得分:3)

就我个人而言,我喜欢使用break获取imm和Marks的答案,但您也可以这样做:

a = None
def set_a(x):
    global a
    a = x
    return a

while set_a(sys.stdin.read(1)) != '\n':
    print('yo')

虽然我不推荐它。

答案 4 :(得分:3)

Python 3.8开始,并引入assignment expressions (PEP 572):=运算符),现在可以将表达式值(此处为sys.stdin.read(1))捕获为变量,以便在while的正文中使用它:

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

此:

  • sys.stdin.read(1)分配给变量i
  • 比较i\n
  • 如果条件得到验证,请输入while正文,其中可以使用i