限制python 3中的无效输入

时间:2014-03-08 20:38:01

标签: python python-3.x syntax

我需要限制允许的无效输入数量,以便在给定的尝试次数后程序退出。

无效是由输入小于零定义的。

尝试的次数是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()

我如何限制无效输入尝试的次数并使之成为代码将返回再次询问问题并提示输入但仍记录以前的尝试?

4 个答案:

答案 0 :(得分:2)

您必须使用循环,在这种情况下,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是方法的名称,因此您不应该使用相同的名称调用内部变量(因为如果这样做,您将无法在内部使用该函数,如果有必要),在这种情况下我调用方法{{1}}。

答案 1 :(得分:1)

在number = ...之前使用while循环,例如:

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

答案 2 :(得分: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循环还是递归通常都是一种品味问题。它们在许多情况下在功能上是等效的,其中就是这种情况。此示例还说明了如果用户输入的数字不是数字会发生什么,这会导致浮动投射。

<强>更新 澄清OP提出的问题:

def get_numbers(max_tries, count = 0)

定义一个函数get_numbers,它接受​​两个输入max_triescountcount被赋予默认值count = 0,这意味着如果您在未指定count参数的情况下调用该函数,它将自动将其指定为0max_tries没有默认值,这意味着每次调用函数时都需要指定它,否则python会抛出错误。如果您通常具有相同的最大尝试次数,您也可以为此分配一个默认值,这样您就可以简单地执行number = get_numbers()并使其按预期工作。

过度简化的

Recursion基本上是一个函数在执行期间调用自身的时候。我们假设我们做了以下事情:

 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,这将导致函数最终返回一个值。

阅读我喜欢的维基,如果不绘制它,递归很难解释,但希望这会有所帮助。

答案 3 :(得分:1)

实际上,我认为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时才会运行。