簡體   English   中英

限制python 3中的無效輸入

[英]limiting invalid input in python 3

我需要限制允許的無效輸入的數量,以便在給定的嘗試次數后,程序退出。

無效由輸入小於零定義。

可以說的嘗試次數為3。

def number():        
    number = float(input('please enter a number (must be greater thatn zero): '))

    if number >= 0 :    
        print ('you choose number:', number)    
    else:
        print ('invalid input')    
        return 

number()

我將如何限制無效輸入嘗試的次數並使其無效,以使代碼返回到再次詢問問題並提示輸入,但仍跟蹤先前的嘗試?

您必須使用循環 ,在這種情況下, while循環將很方便。 您必須聲明一個變量invalid_attempts以保持用戶給定的無效輸入的數量。

完成循環的條件將是當invalid_attempts大於或等於3時,它會在獲得無效輸入時增加。 您可能需要更改3以適合您的要求:

def get_input():
    invalid_attempts = 0

    while invalid_attempts < 3:
        number = float(input('please enter a number (must be greater thatn zero): '))

        if number >= 0 :
            print ('you choose number:', number)
            return number # so you can call the method as 'some_variable = get_input()'
        else:
            print ('invalid input')
            invalid_attempts += 1

注意:由於number是方法的名稱,因此您不應在內部使用相同的名稱調用變量(因為如果這樣做,則在必要時將無法在內部使用該函數),在這種情況下,正在調用方法get_input

在數字= ...之前使用whilie循環,例如:

count = 0
while count < 3:
    # do rest of the stuffs
    count += 1

您還可以使用遞歸更優雅地做到這一點:

def get_number(max_tries, count = 0)
    if count < max_tries:
       valid_input = False
       number      = 0
       try:
           number = float(input('Please enter a number > 0'))
           if number > 0:
              valid_input = True
       except:
           pass
       if valid_input:
          return number
       else:
          return get_numbers(max_tries, count+1)
    else:
       print('Sorry, Too many Tries!)
       return None

是否使用while循環或遞歸通常取決於您的口味。 在許多情況下,它們在功能上是等效的。 此示例還說明了如果用戶輸入的數字不是數字會發生什么,這將導致float轉換拋出。

更新:要澄清OP提出的問題:

def get_numbers(max_tries, count = 0)

定義一個函數get_numbers ,該函數接受兩個輸入max_triescount count被賦予默認值count = 0 ,這意味着如果您在不指定count參數的情況下調用該函數,它將自動將其分配為0 max_tries沒有默認值,這意味着您每次調用函數時都需要指定它,否則python會拋出錯誤。 如果通常具有相同的最大嘗試次數,則還可以為其指定一個默認值,這將使您可以簡單地執行number = get_numbers()並使它按預期工作。

遞歸 ,過度簡化,基本上是函數在執行過程中調用自身時。 假設我們做了以下工作:

 number = get_number(10)

然后用戶輸入-1,這將導致代碼達到:

 else:
     return get_numbers(max_tries, count+1)

由於我們說過get_numbers(10)max_tries = 10count = 0 ,所以這一行變成:

 else:
    return get_numbers(10, 1)

這將導致函數再次返回調用get_numbers的結果。 最終,用戶將輸入有效輸入,或者count > max_tries ,這將導致該函數最終返回一個值。

閱讀我喜歡的Wiki,如果不繪制遞歸就很難解釋,但是希望可以有所幫助。

實際上,我認為for循環看起來更好:

for retry in range(5): # number of retries
    try:
        choice = float(input('please enter a number (must be greater thatn zero): '))
    except ValueError:
        print('Please enter an actual number')
        continue
    if choice >= 0:
        print('You chose ', choice)
        break
    else:
        print('Number must be >= 0')
        continue
else:
    print('Too many failures: be more cooperative')

(這稱為for-else構造; else僅在for循環未break )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM