2011-10-15 207 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'):