如何将输入读取为数字?

How can I read inputs as numbers?

提问人: 提问时间:12/8/2013 最后编辑:smci 更新时间:9/10/2023 访问量:1079811

问:

这个问题的答案是社区的努力。编辑现有答案以改进此帖子。它目前不接受新的答案或互动。

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

(注意:在 Python 2.x 中使用 .在 Python 3.x 中,使用 . 在 Python 3.x 中重命名为)raw_input()input()raw_input()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
python-3.x python-2.7 输入 int

评论

0赞 Patrick Artner 9/14/2018
询问用户输入直到他们给出有效的响应

答:

393赞 thefourtheye 12/8/2013 #1

从 Python 3 开始,返回一个字符串,您必须将其显式转换为 int,如下所示input

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'

对于可以具有小数分量的值,类型将是 而不是 :floatint

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

Python 2 和 3 之间的区别

总结

  • Python 2 的函数评估接收到的数据,将其隐式转换为整数(阅读下一节以了解其含义),但 Python 3 的函数不再这样做。inputinput
  • Python 2 相当于 Python 3 的函数。inputraw_input

蟒蛇 2.x

有两个函数可以获取用户输入,称为 inputraw_input。它们之间的区别在于,不评估数据并以字符串形式按原样返回。但是,将评估您输入的任何内容,并将返回评估结果。例如raw_inputinput

>>> 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'>)

对数据进行评估,结果为 。当它计算表达式时,它会检测到您正在添加两个数字,因此结果也将是相同的类型。因此,类型转换是免费完成的,并作为 和 的结果返回,并存储在变量中。您可以将其视为使用 eval 调用组合。5 + 17225 + 17int22inputdatainputraw_input

>>> data = eval(raw_input("Enter a number: "))
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)

注意:在 Python 2.x 中使用时应小心。在这个答案中,我解释了为什么使用它时应该小心。input

但是,不会计算输入并按原样返回字符串。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'>)

蟒蛇 3.x

Python 3.x 的输入和 Python 2.x 的输入相似,在 Python 3.x 中不可用。raw_inputraw_input

>>> 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'>)

评论

0赞 Shreyan Mehta 4/9/2016
有没有其他方法,比如函数或其他东西,这样我们就不需要在 3.x 中转换为 int,而不是显式转换为 int?
0赞 thefourtheye 4/9/2016
@ShreyanMehta会起作用,但除非你有迫切的理由,否则不要这样做。eval
3赞 spectras 4/6/2018
@thefourtheye至少为此使用ast.literal_eval。它没有安全问题。eval
1赞 Karl Knechtel 3/25/2023
我不明白这里其他评论的意义。调用函数所需的工作量与调用 相同。如果你的意思是,将转换工作与获取工作结合起来的东西,那么自己创建它很容易。intintinput
19赞 Martijn Pieters 12/8/2013 #2

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

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
53赞 user2555451 12/8/2013 #3

在 Python 3.x 中,已重命名为 并删除了 Python 2.x。raw_inputinputinput

这意味着,就像 Python 3.x 中的输入一样,总是返回一个字符串对象。raw_input

要解决此问题,您需要通过将这些输入放在 int 中来显式地将它们转换为整数:

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
3赞 Aravind 5/23/2014 #4

我在 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:])

现在我使用 and 作为整数。num1num2

评论

0赞 5/24/2014
这看起来很有趣。但是,退出循环时不会销毁吗?ifor
0赞 Aravind 5/24/2014
@hosch250退出循环时,索引变量 (here, ) 的值保持不变。我试过这件作品,它工作正常。i
1赞 301_Moved_Permanently 7/12/2018
对于这种输入操作,如果您知道会遇到多少整数,则可以进行操作。num1, num2 = map(int, input().split())nums = list(map(int, input().split()))
13赞 gumboy 7/8/2014 #5

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

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

您还可以使用列表推导式:

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

为了将所有输入从 string 转换为 int,我们执行以下操作:

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

列表元素应以直线打印。

35赞 user1341043 11/11/2014 #6

对于一行中的多个整数,map 可能会更好。

arr = map(int, raw_input().split())

如果数字已经知道(如 2 个整数),则可以使用

num1, num2 = map(int, raw_input().split())
2赞 Sanyal 6/30/2015 #7
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
7赞 Hemanth Savasere 4/18/2016 #8

转换为整数:

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

同样,对于浮点数:

my_decimalnumber = float(input("enter the number"))
1赞 Tobias Kienzler 11/23/2016 #9

在您的示例中,在任何情况下都可以解决问题,但 builtins.input 值得考虑,因为它可以确保您的代码适用于 Python 2 和 3,禁用 Python2 的默认行为,即尝试“聪明”输入数据类型(基本上只是表现得像)。int(input(...))python-futureinputbuiltins.inputraw_input

7赞 ravi tanwar 8/4/2018 #10
n=int(input())
for i in range(n):
    n=input()
    n=int(n)
    arr1=list(map(int,input().split()))

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