Assignment Condition in Python While Loop

2019-01-07 16:17发布

In C, one can do

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

but in Python, it appears, one cannot.

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

generates

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

(the ^ should be on the =)

Is there a workaround?

4条回答
Animai°情兽
2楼-- · 2019-01-07 16:39

Use break:

while True:
    i = sys.stdin.read(1)
    if i == "\n":
       break
    # etc...
查看更多
爷、活的狠高调
3楼-- · 2019-01-07 16:43

A version without functools:

for i in iter(lambda: sys.stdin.read(1), '\n'):
查看更多
在下西门庆
4楼-- · 2019-01-07 16:44

You can accomplish this using the built-in function iter() using the two-argument call method:

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

Documentation for this:

iter(o[, sentinel])
...
If the second argument, sentinel, is given, then o must be a callable object. The iterator created in this case will call o with no arguments for each call to its next() method; if the value returned is equal to sentinel, StopIteration will be raised, otherwise the value will be returned.

One useful application of the second form of iter() is to read lines of a file until a certain line is reached. The following example reads a file until the readline() method returns an empty string:

with open('mydata.txt') as fp:
    for line in iter(fp.readline, ''):
        process_line(line)
查看更多
【Aperson】
5楼-- · 2019-01-07 16:47

Personally I like imm's and Marks answers using break, but you could also do:

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

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

though I wouldn't recommend it.

查看更多
登录 后发表回答