如何将输入读取为数字?

259

为什么下面的代码中 xy 是字符串而不是整数?

(注意:在 Python 2.x 中使用 raw_input()。在 Python 3.x 中使用 input()raw_input() 在 Python 3.x 中被重命名为 input()。)

play = True

while play:

    x = input("Enter a number: ")
    y = input("Enter a number: ")

    print(x + y)
    print(x - y)
    print(x * y)
    print(x / y)
    print(x % y)

    if input("Play again? ") == "no":
        play = False

10个回答

393
自从Python 3以后,input函数返回一个字符串,你必须显式地将其转换为int,像这样。
x = int(input("Enter a number: "))
y = int(input("Enter a number: "))

你可以像这样接受任何进制的数字
>>> data = int(input("Enter a number: "), 8)
Enter a number: 777
>>> data
511
>>> data = int(input("Enter a number: "), 16)
Enter a number: FFFF
>>> data
65535
>>> data = int(input("Enter a number: "), 2)
Enter a number: 10101010101
>>> data
1365

第二个参数告诉它数字的基数,然后它会内部理解并转换它。如果输入的数据有误,它会抛出一个 ValueError 异常。
>>> data = int(input("Enter a number: "), 2)
Enter a number: 1234
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: invalid literal for int() with base 2: '1234'

对于可以有小数部分的值,类型应该是float而不是int
x = float(input("Enter a number:"))

Python 2和3之间的区别

摘要

  • Python 2的input函数会对接收到的数据进行评估,并将其隐式转换为整数(请阅读下一节以了解其含义),但是Python 3的input函数不再这样做。
  • Python 2中与Python 3的input等效的函数是raw_input

Python 2.x

有两个用于获取用户输入的函数,分别称为inputraw_input。它们之间的区别是,raw_input不会对数据进行评估,并以字符串形式返回。但是,input会对您输入的内容进行评估,并返回评估结果。例如:

>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)

数据5 + 17被计算并得出结果22。当它计算表达式5 + 17时,它检测到您正在将两个数字相加,因此结果也将是相同的int类型。因此,类型转换是免费的,并且22作为input的结果返回并存储在data变量中。您可以将input视为由eval调用组成的raw_input
>>> data = eval(raw_input("Enter a number: "))
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)

注意:在使用Python 2.x中的input时,你应该小心。我解释了为什么在使用它时要小心,你可以在this answer中找到解释。
但是,raw_input不会对输入进行评估,而是将其作为字符串返回。
>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = raw_input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <type 'str'>)

Python 3.x的input和Python 2.x的raw_input相似,但raw_input在Python 3.x中不可用。
>>> import sys
>>> sys.version
'3.4.0 (default, Apr 11 2014, 13:05:11) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <class 'str'>)

有没有其他方法,比如函数或其他东西,可以在3.x中避免将数据显式转换为int类型而不需要转换? - Shreyan Mehta
@ShreyanMehta eval会起作用,但除非你有紧急原因,否则不要使用它。 - thefourtheye
3
至少使用ast.literal_eval。它不会像eval一样存在安全问题。请注意保持原意,使内容更加通俗易懂。 - spectras
1
我不理解这里其他评论的意义。调用函数所需的工作量与调用“int”相同。如果您是指将“int”转换工作与“input”获取工作结合起来的东西,那么自己创建它很容易。 - Karl Knechtel

53
在Python 3.x中,raw_input被重命名为input,而Python 2.x中的input已被删除。
这意味着,就像raw_input一样,在Python 3.x中input始终返回一个字符串对象。
要解决问题,您需要通过将它们放入int中,显式地将这些输入转换为整数:
x = int(input("Enter a number: "))
y = int(input("Enter a number: "))

35

如果一行中有多个整数,使用map可能更好。

arr = map(int, raw_input().split())
如果数字已知(例如2个整数),您可以使用。
num1, num2 = map(int, raw_input().split())

19

input()(Python 3)和raw_input()(Python 2)始终返回字符串,使用int()显式地将结果转换为整数。

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))

13

多个问题需要在一行上输入多个整数。最好的方法是逐行输入完整的数字字符串,然后将它们拆分为整数。以下是 Python 3 版本:

a = []
p = input()
p = p.split()      
for i in p:
    a.append(int(i))

你也可以使用列表推导式:

p = input().split("whatever the seperator is")

将所有输入从字符串转换为整数,我们需要执行以下操作:

x = [int(i) for i in p]
print(x, end=' ')

列表元素应该直线排列。


7

转换为整数:

my_number = int(input("enter the number"))

同样适用于浮点数:

my_decimalnumber = float(input("enter the number"))

7
n=int(input())
for i in range(n):
    n=input()
    n=int(n)
    arr1=list(map(int,input().split()))

for循环将运行'n'次。第二个'n'是数组的长度。 最后一条语句将整数映射到列表,并以空格分隔的形式输入。 您也可以在for循环结束时返回数组。


3
我在解决CodeChef上的一个问题时遇到了一个整数输入问题,需要从一行中读取由空格分隔的两个整数。虽然对于单个整数来说int(input())已经足够,但我没有找到直接输入两个整数的方法。我尝试过以下代码:
num = input()
num1 = 0
num2 = 0

for i in range(len(num)):
    if num[i] == ' ':
        break

num1 = int(num[:i])
num2 = int(num[i+1:])

现在我使用 num1num2 作为整数。

这看起来非常有趣。然而,当for循环退出时,i不是被销毁了吗? - user2509848
当循环退出时,索引变量(这里是 i)的值保留不变。我尝试了这段代码,它可以正常工作。@hosch250 - Aravind
1
对于这种输入操作,如果你知道会遇到多少个整数,可以使用 num1, num2 = map(int, input().split()),否则可以使用 nums = list(map(int, input().split())) - 301_Moved_Permanently

2
def dbz():
    try:
        r = raw_input("Enter number:")
        if r.isdigit():
            i = int(raw_input("Enter divident:"))
            d = int(r)/i
            print "O/p is -:",d
        else:
            print "Not a number"
    except Exception ,e:
        print "Program halted incorrect data entered",type(e)
dbz()

Or 

num = input("Enter Number:")#"input" will accept only numbers

1
在你的例子中,int(input(...)) 在任何情况下都能起作用,但值得考虑的是 python-futurebuiltins.input,因为这可以确保你的代码适用于 Python 2 和 3,并禁用 Python2 中 input 尝试“聪明地”确定输入数据类型的默认行为(builtins.input 基本上只像 raw_input 一样运行)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接