关于python:如何将输入读作数字?

How can I read inputs as numbers?

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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


TLDR

  • python 3不评估用input函数接收到的数据,但是python 2的input函数可以(阅读下一节了解其含义)。
  • python 2与python 3的input的等价物是raw_input函数。

Python 2 x

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

1
2
3
4
5
6
7
8
>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56)
[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

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

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

但是,raw_input不计算输入,而是以字符串的形式返回。

1
2
3
4
5
6
7
8
>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56)
[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

python 3.x的input和python 2.x的raw_input相似,python 3.x中没有raw_input

1
2
3
4
5
6
7
8
>>> import sys
>>> sys.version
'3.4.0 (default, Apr 11 2014, 13:05:11)
[GCC 4.8.2]'

>>> data = input("Enter a number:")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <class 'str'>)

解决方案

为了回答您的问题,因为python 3.x不评估和转换数据类型,所以您必须使用int显式地转换为int,如下所示

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

您可以接受任何基数的数字,并使用int函数将其直接转换为base-10,如下所示

1
2
3
4
5
6
7
8
9
10
11
12
>>> 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

1
2
3
4
5
>>> 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

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

除此之外,你的程序可以稍微改变一下,像这样

1
2
3
4
5
while True:
    ...
    ...
    if input("Play again?") =="no":
        break

通过使用breakwhile True,可以去掉play变量。


在python 3.x中,raw_input被重命名为input,python 2.x input被删除。

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

要解决这个问题,您需要将这些输入显式地放入int中,使其成为整数:

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


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

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

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

1
num1, num2 = map(int, raw_input().split())

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

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

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

1
2
3
4
5
a = []
p = input()
p = p.split()      
for i in p:
    a.append(int(i))

转换为整数:

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

同样,对于浮点数:

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

我在解决codechef问题时遇到了一个接受整数输入的问题,其中两个整数(由空格分隔)应该从一行中读取。

虽然int(input())对于单个整数是足够的,但我没有找到直接输入两个整数的方法。我试过这个:

1
2
3
4
5
6
7
8
9
10
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:])

现在我使用num1和num2作为整数。希望这有帮助。


1
2
3
4
5
n=int(input())
for i in range(n):
    n=input()
    n=int(n)
    arr1=list(map(int,input().split()))

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


在您的示例中,int(input(...))在任何情况下都会起作用,但python-futurebuiltins.input是值得考虑的,因为这样可以确保您的代码适用于python2和3,并禁用python2的默认input行为,试图对输入数据类型"聪明"(builtins.input基本上与raw_input行为类似)。