Python の while(expression) ループ内で変数の代入を行うにはどうすればよいですか?
-
23-08-2019 - |
質問
割り当てられた値を返し、それを while ループ内で直接空の文字列と比較するために、変数を割り当てています。
PHPでそれを行う方法は次のとおりです。
while((name = raw_input("Name: ")) != ''):
names.append(name)
私がやろうとしていることは、機能的にはこれと同じです。
names = []
while(True):
name = raw_input("Name: ")
if (name == ''):
break
names.append(name)
Pythonでこれを行う方法はありますか?
解決
from functools import partial
for name in iter(partial(raw_input, 'Name:'), ''):
do_something_with(name)
またはあなたがリストを必要とします。
>>> names = list(iter(partial(raw_input, 'Name: '), ''))
Name: nosklo
Name: Andreas
Name: Aaron
Name: Phil
Name:
>>> names
['nosklo', 'Andreas', 'Aaron', 'Phil']
他のヒント
あなたが発電機にそれを回すためにraw_input()
をラップすることができます:
def wrapper(s):
while True:
result = raw_input(s)
if result = '': break
yield result
names = wrapper('Name:')
私たちは振り出しに戻ったが、より複雑なコードにしていることを意味します。既存のメソッドをラップする必要があるのであれば、あなたは nosklo ののアプローチを使用する必要があります。
いや、ごめんなさい。これはよくある質問で、ここで詳しく説明されています。
で パイドキュメント, 、 そして フレドリック・ルンドのブログ.
Python 式で代入が許可されない理由は、他の言語ではよくある、見つけにくいバグです。
多くの代替案が提案されている。ほとんどは、入力の手間を省くハッキングですが、恣意的または不可解な構文やキーワードを使用しており、言語変更提案の単純な基準を満たしていません。まだその構造を理解していない人間の読者に、適切な意味を直観的に示唆する必要があります。
興味深い現象は、経験豊富な Python プログラマーのほとんどが、
while True
イディオムであり、式構造の代入があまり欠けていないようです。これを言語に追加したいという強い願望を表明するのは新参者だけです。これを別の魅力的に綴る方法もあります。
line = f.readline() while line: ... # do something with line... line = f.readline()
私は7年後半だけど、別の解決策があります。それは私が考えることができる最善の解決策ではないのですが、それは呼び出すとStopIteration例外の興味深い使用を強調しています。あなたは、ファイル/ソケットを読み込むチャンクの同様のループを行うとうまくタイムアウトやその他もろもろを扱うことができます。
names=[]
try:
while True:
f = raw_input()
if not f:
raise StopIteration
else:
names.append(f)
except StopIteration:
pass
print names
names = []
for name in iter(lambda: raw_input("Name: "), ''):
names.append(name)
PEP 572 のが提案の代入式をそして、既に受け入れられています。 Pythonの3.8以降では、あなたが書くことができるようになります:
while name := input("Name: "):
names.append(name)
構文とセマンティクスの一部を引用いくつかのより多くの例については、PEPのます:
# Handle a matched regex
if (match := pattern.search(data)) is not None:
# Do something with match
# A loop that can't be trivially rewritten using 2-arg iter()
while chunk := file.read(8192):
process(chunk)
# Reuse a value that's expensive to compute
[y := f(x), y**2, y**3]
# Share a subexpression between a comprehension filter clause and its output
filtered_data = [y for x in data if (y := f(x)) is not None]