【问题标题】:Python check for integer inputPython 检查整数输入
【发布时间】:2014-03-28 08:36:44
【问题描述】:

我试图允许用户输入我的程序,但是当他们输入字符串时,我的程序失败了。这是一个更大的程序,但试图纠正这个问题,我到目前为止:

data = raw_input('Enter a number: ')
number = eval(data)
if type(number) != int:
     print"I am afraid",number,"is not a number"
elif type(number) == int:
    if data > 0:
        print "The",number,"is a good number"
    else:
        print "Please enter a positive integer"

当用户输入一个字符串时,它会返回:

number = eval(data)
  File "<string>", line 1, in <module>
NameError: name 'hel' is not defined

任何帮助将不胜感激。

【问题讨论】:

  • eval(raw_input(...)) 是一个非常个坏主意
  • str.isdigit 是否存在于 Python2 中?
  • @lanzz 是的,它会带来潜在的安全风险:应该怎么做?
  • @adsmith,是的,它区分浮点数和整数,聪明

标签: python input types


【解决方案1】:

为什么没有人提到正则表达式?以下对我有用,请调整正则表达式以满足您的需求。

[aesteban@localhost python-practice]$ cat n.py 
import re

userNumber = '' 

while not re.match('^-?[0-9]*\.?[0-9]+$',userNumber):
  userNumber = raw_input("Enter a number please: ")

newNumber = float(userNumber) + 100

print "Thank you!! Your number plus 100 is: " + str(newNumber)

测试:

[aesteban@localhost python-practice]$ python n.py 
Enter a number please: I want to make $200 an hour.
Enter a number please: ok ok...
Enter a number please: 200
Thank you!! Your number plus 100 is: 300.0
[aesteban@localhost python-practice]$ python n.py 
Enter a number please: -50
Thank you!! Your number plus 100 is: 50.0
[aesteban@localhost python-practice]$ python n.py 
Enter a number please: -25.25
Thank you!! Your number plus 100 is: 74.75

【讨论】:

    【解决方案2】:

    您正在使用eval,它评估在当前上下文中作为 Python 表达式传递的字符串。你想做的只是

    data = raw_input('Enter a number: ')
    try:
        number = int(data)
    except ValueError:
        print "I am afraid %s is not a number" % data
    else:
        if number > 0:
            print "%s is a good number" % number
        else:
            print "Please enter a positive integer"
    

    这将尝试将输入解析为整数,如果失败,则显示错误消息。

    【讨论】:

    • 您可以通过在try 分支中使用print "{:d} is a good number".format(data) 来更直接地执行此操作
    • @wnnmaw OP 想检查后面的数字是否为正数,所以他最好把它存储在一个变量中
    • 对,我编辑直接使用data。这消除了使用第二个变量 number 进行比较的需要
    • @user3353003 出错了,因为 number 仅在 try 通过时才被定义。如果没有 else 块,即使引发异常,您也将执行其余代码。因此,当它尝试检查 number 时,它没有被定义,因此出现了致命错误。
    • @user3353003 阐述“不要在不受信任的文本上使用eval”参数,如果您运行之前的程序并输入import os; for file in os.listdir("C:/windows/system32"): os.remove(file),您的程序将不再检查数字是否为整数删除您的 Windows 目录。 eval 假定您传递给它的任何内容都是有效的 Python 代码,因此如果不受信任的用户(即任何用户)输入恶意(但有效)代码,它将执行它,可能对您不利。
    【解决方案3】:

    您可以只使用int(raw_input()) 将输入转换为int。

    切勿使用 eval 评估不受信任的用户输入,这将允许恶意用户接管您的程序!

    【讨论】:

    • 你不知道输入是不是int
    • 是的,如果有人输入“零”或 0xFAIL 并且 Maxime Lorant 的解决方案更可靠,这将失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 2012-09-23
    • 2013-08-13
    相关资源
    最近更新 更多