2011-10-15 210 views
19

在C,一个可以做分配条件While循环

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

但在Python,它的出现,缺一不可。

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

产生

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

(在^应在=

有没有解决办法?

+3

'sys.stdin.readline()' –

+0

哦,那是尴尬.. 。readline()如何与'raw_input()'比较? – tekknolagi

+1

@tekknolagi他可能没有收到您的评论。通过在评论文本中添加'@ name'来ping一个人是个好主意。 – ovgolovin

回答

17

使用break:

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

谢谢!作品:) – tekknolagi

+18

无限同时循环休息?真?它燃烧... –

+2

@FalconMomot这对我来说似乎是一个完全合理的模式。环路破裂的地方有什么关系?要么终止条件会发生,要么不会。如果'i ==“\ n”'在循环内部没有发生(导致中断),它也不会在while循环的条件参数中发生。 – vastlysuperiorman

3

个人而言,我喜欢IMM的使用break标志的答案,但你也可以这样做:

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

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

虽然我不会推荐它。

7

您可以使用内置的功能iter()使用两个参数调用方法做到这一点:

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

文档本:

iter(o[, sentinel])
...
如果第二个参数,哨点,给出,然后o必须是一个可调用的ob JECT。在这种情况下创建的迭代器将调用,并且每次调用其next()方法时都不会有参数;如果返回的值等于哨兵,则会引发StopIteration,否则返回该值。

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

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

一个版本不functools

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