2013-01-25 156 views
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循環?如何從循環內的函數循環中打破Python

+1

這只是概念驗證,因爲邏輯是你想要做什麼很令人費解? – Hoopdady

+0

這個想法是,函數應該處理/處理/格式化輸入,然後返回結果,但某些關鍵字(如「退出」或「通過」)我需要通過某種方式影響while循環調用「break」或「continue 」。從審美角度而言,我不喜歡在循環中直接使用所有這些例外/關鍵字的想法。但我對這一切都很陌生,所以也許我只是不知道這種「適當」的風格。 – alnafie

回答

1

我經常這樣做:

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

for input in getInput(): 
    if input == 'exit': 
     break 
    result = useInput(input) 
0

可以拋出一個異常,並處理它的while之外......但可能會造成一些混亂的代碼...

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

except RuntimeError: 
    pass 

這是MUCH最好只返回一個布爾值標誌,然後取決於該標誌的值是否中斷。如果你擔心你已經有了要回,不要煩惱事 - 蟒蛇會很樂意讓你的函數返回多於一兩件事:

def func() 
    ... 
    return something,flag 

while True: 
    something,flag = func() 
    if flag: 
     break 
2
  1. 引發異常,你可以處理在While循環之外
  2. 返回一個標誌,由調用者捕獲並相應處理。請注意,"if logic" directly in the while loop,將是最優選的方式。
2

Python有發電機中一個很酷的功能 - 這些讓你輕鬆製作與一個for循環使用iterables,可以簡化這種代碼。

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"的支票硬編碼到生成器中,但如果您在少數地方需要類似的行爲,則可能值得保留它。

請注意,這也意味着您可以在list comprehension內使用它,因此也很容易建立結果列表。

編輯:另外,我們可以用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: ")): 
    ... 
0

那麼,如果它只是美學這就是防止你把它放在while循環則上述任何會工作...不是的嘗試的粉絲/除了一個雖然。只要知道,將它放在自己的功能中不會有任何性能差異。這裏有一個,我相信也能滿足您的要求:-)

# 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