web-dev-qa-db-ja.com

Python Whileループの割り当て条件

Cでは、

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

しかし、Pythonでは、表示されません。

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

生成します

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

^=にある必要があります)

回避策はありますか?

29
tekknolagi

休憩を使用する:

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

これは、組み込み関数 iter() を使用して2つの引数の呼び出しメソッドを使用して実現できます。

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

このためのドキュメント:

iter(o[, sentinel])
.。
2番目の引数sentinelが指定されている場合、o呼び出し可能なオブジェクトである必要があります。この場合に作成されたイテレータは、oを呼び出し、その next() メソッドへの呼び出しごとに引数はありません。 ;返される値がsentinelと等しい場合、 StopIteration が発生します。それ以外の場合、値が返されます。 。

iter() の2番目の形式の1つの便利なアプリケーションは、特定の行に到達するまでファイルの行を読み取ることです。次の例では、readline()メソッドが空の文字列を返すまでファイルを読み取ります。

_with open('mydata.txt') as fp:
    for line in iter(fp.readline, ''):
        process_line(line)
_
9
Andrew Clark

functoolsのないバージョン:

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

_Python 3.8_を開始し、 代入式(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本文を入力します
4
Xavier Guihot

個人的には、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')

私はそれをお勧めしませんが。

3
Owen