【问题标题】:Python how to only accept numbers as a inputPython如何只接受数字作为输入
【发布时间】:2014-12-16 23:51:20
【问题描述】:
mark= eval(raw_input("What is your mark?"))
try:
    int(mark)
except ValueError:
    try:
        float(mark)
    except ValueError:
        print "This is not a number"

所以我需要制作一个 Python 程序来查看您的标记,并根据标记的内容为您提供不同的响应。

但是,我还需要添加一种方法来阻止将不是数字的随机文本输入到程序中。

我以为我已经找到了解决这个问题的方法,但它不会让它超过故障安全代码的第一条语句,如果它不是数字的话,它意味着捕获它。

如果我输入 hello 而不是数字,那么几乎会发生什么,它会在第一行失败并返回一个错误,上面写着 exceptions:NameError: name 'happy' is not defined。

我怎样才能改变它,以便它可以使它成为为他们提供他们需要输入数字的打印语句的代码?

【问题讨论】:

  • 不要使用评估
  • 为什么在这段代码中还需要eval?没有它,它应该可以正常工作。
  • 尝试使用 assert 或 isInstance
  • @Bogdan 因为用户可以输入命令,例如rm -rf / 在python中使用系统命令,如果python以root权限运行,问题就大了。
  • @Marcin:如果他使用 eval,这是一个问题,我的评论说他不需要使用它。

标签: python python-2.x


【解决方案1】:

删除 eval 并且您的代码是正确的:

mark = raw_input("What is your mark?")
try:
    int(mark)
except ValueError:
    try:
        float(mark)
    except ValueError:
        print("This is not a number")

只检查浮点数就可以了:

try:
    float(mark)
except ValueError:
    print("This is not a number")

【讨论】:

  • 别担心,不客气,真的要小心 eval,很少有充分的理由使用它
【解决方案2】:

声明一个全局值比传递一个参数更容易吗? 在我的情况下,它也给出了一个错误。

def getInput():
    global value
    value = input()
    while not value.isnumeric():
        print("enter a number")
        value = input("enter again")
    return int(value)

getInput()
print(value)

#不能评论:)

【讨论】:

    【解决方案3】:

    您可以简单地访问float 或int 并捕获异常(如果有)。您正在使用被认为很差的 eval 并且添加了很多冗余语句。

    try:
        mark= float(raw_input("What is your mark?"))
    except ValueError:
        print "This is not a number"
    

    “为什么不使用 eval?”你问,好吧...试试用户的这个输入:[1 for i in range (100000000)]

    【讨论】:

      【解决方案4】:

      您可以使用名为 isumeric 的 String 对象方法。它比 try-except 方法更有效。请看下面的代码。

      def getInput(prompt):
          value = input(prompt)
          while not value.isnumeric():
              print("enter a number")
              value = input("enter again")
          return int(value)
      

      【讨论】:

        【解决方案5】:
        import re
        
        pattern = re.compile("^[0-9][0-9]\*\\.?[0-9]*")
        
        status = re.search(pattern, raw_input("Enter the Mark : "))
        
        if not status:
        
                print "Invalid Input"
        

        【讨论】:

          【解决方案6】:

          实际上如果你要使用 eval() 你必须定义更多的东西。

          acceptables=[1,2,3,4,5,6,7,8,9,0,"+","*","/","-"]
          try:
              mark= eval(int(raw_input("What is your mark?")))
          except ValueError:
              print ("It's not a number!")
          if mark not in acceptables:
              print ("You cant do anything but arithmetical operations!")
          

          这是 eval() 的基本控制机制。

          【讨论】:

            猜你喜欢
            • 2011-03-09
            • 1970-01-01
            • 1970-01-01
            • 2014-03-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多