2011-10-15 7 views
19

、1は割り当て条件Cのループ

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

が、Pythonで操作を行うことができますが、それは1つができない、表示されます。

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

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

を生成する(^=にする必要があります)

回避策はありますか?

+3

'sys.stdin.readline(' –

+0

ああそれは厄介だ).. readline()メソッドは空の文字列を返すまで次の例では、ファイルを読み込み、 'readline()'と 'raw_input()'はどう違うのですか? – tekknolagi

+1

@tekknolagi彼はおそらくあなたのコメントを受け取りませんでした。コメントテキストに '@ name'を追加して人にpingを実行するとよいでしょう。 – ovgolovin

答えて

17

使用ブレイク:個人的に

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

ありがとう!作品:) – tekknolagi

+18

休憩と無限のwhileループ?本当に?それは燃える... –

+2

@FalconMomotこれは私にとって完全に合理的なパターンのようです。ループがどこで壊れているかは重要です。終了条件が発生するか、終了条件が発生します。 'i ==" \ n "'がループ内で発生しない(ブレークを引き起こす)場合、whileループの条件引き数でも起こらないでしょう。 – vastlysuperiorman

3

私はbreakを使用してIMMのとマーク答えを好きですが、あなたも行うことができます:

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

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

私はそれをお勧めしませんけれども。

7

次の2つの引数の呼び出し方法使用して組み込み関数iter()を使ってこれを実現することができます。このため

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

ドキュメント:

iter(o[, sentinel])
...
た場合を2番目の引数のセンチネルが指定されている場合、は呼び出し可能なob ject。この場合作成されたイテレータは、next()メソッドへの呼び出しごとに、引数なしでoを呼び出します。返される値がのセンチネルに等しい場合はStopIterationが返されます。そうでない場合は値が返されます。

の第2の形式の有用な用途の1つは、ある行に達するまでファイルの行を読み出すことです。

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'): 
関連する問題