2
while True:
    input = raw_input("enter input: ")
    result = useInput(input)

def useInput(input):
    if input == "exit":
        break   #return 0 / quit / etc.. i want to break the while loop from within this function

「if ロジック」を while ループに直接配置できることはわかっていますが、関数内に配置したいと考えています。ループ内で呼び出された関数内から while ループを中断する方法はありますか?

4

5 に答える 5

2
  1. While ループの外側で処理できる例外を発生させます
  2. 呼び出し元によってキャプチャされるフラグを返し、それに応じて処理します。"if logic" directly in the while loop,が最も好ましい方法であることに注意してください。
于 2013-01-25T13:41:53.727 に答える
2

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: ")):
    ...
于 2013-01-25T14:08:05.127 に答える
1

私は通常これを行います:

def getInput():
    while True:
        yield raw_input("enter input: ")

for input in getInput():
    if input == 'exit': 
        break
    result = useInput(input)
于 2013-01-25T13:52:23.563 に答える
0

それがただの美学でwhileループに入れられない場合は、上記のいずれかが機能します...ただし、try/exceptのファンではありません。ただし、独自の機能に入れてもパフォーマンスの違いはないことを知っておいてください。これは、あなたの要件も満たしていると私が信じているものです:-)

# you have to define the function first if your while isn't in a function
def UseInput():
   input = raw_input("enter input: ")
   if input == "exit":
      return False
   elif input == "pass":
      return True


   # Do stuff
   return True


while UseInput():
   pass
于 2013-01-25T19:00:26.527 に答える
0

例外を発生させて ... の外部で処理することはできwhileますが、それは混乱を招くコードになる可能性があります ...

def useInput(in_):
    if in_ == "exit":
        raise RuntimeError
try:
    while True:
        input = raw_input("enter input: ")
        result = useInput(input)

except RuntimeError:
    pass

ブール値のフラグを返すだけで、そのフラグの値に応じて中断するかどうかを決定する方がはるかに優れています返したいものがすでにあるのではないかと心配している場合でも、心配する必要はありません。Python は喜んで、関数が複数のものを返すようにします。

def func()
    ...
    return something,flag

while True:
    something,flag = func()
    if flag:
        break
于 2013-01-25T13:41:40.380 に答える