2016-05-17 44 views
0

我意識到我正在編寫大量重複代碼,它圍繞模擬do..while循環來驗證用戶輸入。降低Python中模擬do..while循環的頻率

有沒有辦法降低這種重複代碼的頻率?

例如:

validity = False 
while validity == False:   
    choice = input('Enter 1 --> , 2 --> , 3 --> ....') 
    if choice == '1': 
     validity = True 
     stuff1() 
    if choice == '2': 
     validity = True 
     stuff2() 
    if choice == '3': 
     validity = True 
     stuff3() 
    else: 
     print('Invalid Input.') 
+2

你可以使用字典,如果選擇字典的東西,其他。 。 。 – PyNEwbie

+0

該代碼不起作用,因爲'choice'是一個字符串,但是您將其與整數進行比較。順便說一句,「儘管不合法:'做更多Pythonic。 –

+1

更多Pythonic變量名稱也可以是'valid'或'is_valid',而不是'validity'。閱讀更自然。 – Kupiakos

回答

1

您可以使用set

for choice in {1, 2, 3}: 
    validity = True 
    stuff() 

還是一個tuple

for choice in (1, 2, 3): 
    validity = True 
    stuff() 

此外,而不是做:

while validity == False: 

做falsey檢查:

while not validity: 
+0

除了語義之外,'while not'和'== False'之間是否存在任何性能差異? – iridescent

+0

我編輯了我的問題,使其更清晰。每個選項都應該是不同的東西(),我的不好。 – iridescent

+1

@iridescent:是的,第二種形式效率稍高一點,但更重要的是,[PEP008](https://www.python.org/dev/peps/pep-0008/#programming-recommendations)說:「不要將布爾值與True或False進行比較,使用==「 –

1

您也可以刪除validity和使用break聲明:

while True: 
    choice = input('Enter 1 --> , 2 --> , 3 --> ....') 
    if choice in (1, 2, 3): 
     stuff() 
     break 
    else: 
     print('Invalid Input.') 
0

假設你的意思是:

validity = False 
while validity == False:   
    choice = input('Enter 1 --> , 2 --> , 3 --> ....') 
    if choice == '1': 
     validity = True 
     stuff1() 
    if choice == '2': 
     validity = True 
     stuff2() 
    if choice == '3': 
     validity = True 
     stuff3() 
    else: 
     print('Invalid Input.') 

那麼你可以做:

actions = { '1': stuff1, '2': stuff2, '3': stuff3 } 
invalid = lambda: print('Invalid Input.') 
while True: 
    choice = input('Enter 1 --> , 2 --> , 3 --> ....') 
    action = actions.get(choice, invalid) 
    action() 
    if action is not invalid: 
     break 

你可以把它變成一個可重複使用的功能:

def act(actions): 
    while True: 
     val = input('Enter 1 --> %d: '%len(actions)) 
     try: 
      choice = int(val)-1 
     except ValueError: 
      choice = -1 
     if not 0 <= choice < len(actions): 
      print('Invalid Input.') 
     else: 
      break 
    actions[choice]() 

,所以你只需要:

act([stuff1, stuff2, stuff3]) 

例如:

>>> act([lambda: print("chose 1"), lambda: print("chose 2"), lambda: print("chose 3")]) 
Enter 1 --> 3: 4 
Invalid Input. 
Enter 1 --> 3: 3 
chose 3 

編輯:更新,以反映使用python3 input(),它返回字符串,並顯示它的工作原理

+0

問題已更新:」選擇「正在針對字符串進行測試,而不是整數。 –