【问题标题】:Python - Input ValidationPython - 输入验证
【发布时间】:2013-10-10 01:03:35
【问题描述】:

我正在寻找创建代码,该代码要求用户在继续之前输入大于 2 的整数。我正在使用python 3.3。到目前为止,这是我所拥有的:

def is_integer(x):
    try:
        int(x)
        return False
    except ValueError:
        print('Please enter an integer above 2')
        return True

maximum_number_input = input("Maximum Number: ")

while is_integer(maximum_number_input):
    maximum_number_input = input("Maximum Number: ")

    print('You have successfully entered a valid number')

我不确定如何最好地放入整数必须大于2的条件。我才刚刚开始学习python,但想养成良好的习惯。

【问题讨论】:

  • int(x) 对于整数和非整数值都可以成功。即便如此,您的函数确实应该按照定义称为is_not_integer

标签: python validation input python-3.x python-3.3


【解决方案1】:

这应该可以完成工作:

def valid_user_input(x):
    try:
        return int(x) > 2
    except ValueError:
        return False

maximum_number_input = input("Maximum Number: ")

while valid_user_input(maximum_number_input):
    maximum_number_input = input("Maximum Number: ")
    print("You have successfully entered a valid number")

甚至更短:

def valid_user_input():
    try:
        return int(input("Maximum Number: ")) > 2
    except ValueError:
        return False

while valid_user_input():
    print('You have successfully entered a valid number')

【讨论】:

  • 如果int(x) 没有引发错误,x 不一定是整数。
  • True,如果函数总是接受一个字符串。是时候进行一些修改以取消投票了...
  • @chepner 是的,只要我们使用 Python 3 :)
  • 是的,我只是在上下文之外查看验证函数,认为它可以取任何值,而不仅仅是用户键入的字符串。
【解决方案2】:

我的看法:

from itertools import dropwhile
from numbers import Integral
from functools import partial
from ast import literal_eval

def value_if_type(obj, of_type=(Integral,)):
    try:
        value = literal_eval(obj)
        if isinstance(value, of_type):
            return value
    except ValueError:
        return None

inputs = map(partial(value_if_type), iter(lambda: input('Input int > 2'), object()))

gt2 = next(dropwhile(lambda L: L <= 2, inputs))

【讨论】:

    【解决方案3】:
    def take_user_in():
        try:
            return int(raw_input("Enter a value greater than 2 -> "))  # Taking user input and converting to string
        except ValueError as e:  # Catching the exception, that possibly, a inconvertible string could be given
            print "Please enter a number as" + str(e) + " as a number"
            return None
    
    
    if __name__ == '__main__':  # Somethign akin to having a main function in Python
    
        # Structure like a do-whole loop
        # func()
        # while()
        #     func()
        var = take_user_in()  # Taking user data
        while not isinstance(var, int) or var < 2:  # Making sure that data is an int and more than 2
            var = take_user_in()  # Taking user input again for invalid input
    
        print "Thank you"  # Success
    

    【讨论】:

      【解决方案4】:
      def check_value(some_value):
          try:
             y = int(some_value)
          except ValueError:
             return False
          return y > 2 
      

      【讨论】:

        【解决方案5】:

        希望对你有帮助

        import str
        def validate(s):       
            return str.isdigit(s) and int(s) > 2
        
        • str.isdidig() 将消除所有包含非整数、浮点数 ('.') 和负数 ('-') 的字符串(小于 2)
        • int(user_input) 确认是大于 2 的整数
        • 如果两者都是 True,则返回 True

        【讨论】:

          【解决方案6】:

          这会验证输入是否为整数,但会拒绝看起来像整数的值(如3.0):

          def is_valid(x):
              return isinstance(x,int) and x > 2
          
          x = 0
          while not is_valid(x):
              # In Python 2.x, use raw_input() instead of input()
              x = input("Please enter an integer greater than 2: ")
              try:
                  x = int(x)
              except ValueError:
                  continue
          

          【讨论】:

            【解决方案7】:

            使用其他答案中显示的int() 内置函数的问题是它将浮点数和布尔值转换为整数,因此实际上并不能检查您的参数是否为整数。

            单独使用内置的isinstance(value, int) 方法很诱人,但不幸的是,如果传递一个布尔值,它将返回True。因此,如果您想要 strict 类型检查,这是我简短而实用的 Python 3.7 解决方案:

            def is_integer(value):
                if isinstance(value, bool):
                    return False
                else:
                    return isinstance(value, int)
            

            结果:

            is_integer(True)  --> False
            is_integer(False) --> False
            is_integer(0.0)   --> False
            is_integer(0)     --> True
            is_integer((12))  --> True
            is_integer((12,)) --> False
            is_integer([0])   --> False
            

            等等……

            【讨论】:

              猜你喜欢
              • 2012-04-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-01-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多