Python にはジェネレーターの優れた機能があります。これにより、ループで使用するイテラブルを簡単に生成for
でき、この種のコードを単純化できます。
def input_until(message, func):
"""Take raw input from the user (asking with the given message), until
when func is applied it returns True."""
while True:
value = raw_input(message)
if func(value):
return
else:
yield value
for value in input_until("enter input: ", lambda x: x == "exit"):
...
for
ループは反復子が停止するまでループし、作成した反復子はユーザーが入力すると停止します"exit"
。簡単にするために、これを少し一般化したことに注意してください。チェックを"exit"
ジェネレーターにハードコーディングできますが、いくつかの場所で同様の動作が必要な場合は、一般的なままにしておく価値があるかもしれません。
これは、リスト内包表記内で使用できることも意味することに注意してください。結果のリストも簡単に作成できます。
編集: または、これを次のように構築することもできitertools
ます。
def call_repeatedly(func, *args, **kwargs):
while True:
yield func(*args, **kwargs)
for value in itertools.takewhile(lambda x: x != "exit",
call_repeatedly(raw_input, "enter input: ")):
...