繁体   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