小编典典

如何将输入读取为数字?

all

为什么在下面的代码中是x和字符串而不是整数?y

(注意:在 Python 2.x 中使用raw_input(). 在 Python 3.x 中使用 . 在 Python
3.xinput()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

阅读 110

收藏
2022-05-18

共1个答案

小编典典

解决方案

从 Python 3 开始,input返回一个字符串,您必须将其显式转换为ints, with
int, 像这样

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

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

>>> 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视为与呼叫raw_input组成的。eval

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

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

inputPython 2.7 中的函数,将您输入的任何内容作为 Python 表达式求值。如果您只是想读取字符串,请使用raw_inputPython 2.7 中的函数,它不会评估读取的字符串。

如果您使用的是 Python 3.x,raw_input则已重命名为input. 引用Python 3.0 发行说明

raw_input()`被重命名为`input()`. 也就是说,新`input()`函数从中读取一行`sys.stdin`并将其返回,并去除尾随换行符。`EOFError`如果输入过早终止,它会引发。要获得 的旧行为`input()`,请使用`eval(input())


在 Python 2.7中,有两个函数可用于接受用户输入。一个是input,另一个是raw_input。你可以认为它们之间的关系如下

input = eval(raw_input)

考虑以下代码以更好地理解这一点

>>> dude = "thefourtheye"
>>> input_variable = input("Enter your name: ")
Enter your name: dude
>>> input_variable
'thefourtheye'

input接受来自用户的字符串并评估当前 Python 上下文中的字符串。当我输入dude作为输入时,它发现dude绑定到该值thefourtheye,因此评估结果变为thefourtheye并且被分配给input_variable.

如果我输入当前 python 上下文中不存在的其他内容,它将失败NameError

>>> input("Enter your name: ")
Enter your name: dummy
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'dummy' is not defined

Python 2.7 的安全注意事项input

由于评估了任何用户类型,因此也会带来安全问题。例如,如果您已经os在程序中使用 加载了模块import os,然后用户输入

os.remove("/etc/hosts")

这将被python评估为函数调用表达式,并将被执行。如果您使用提升的权限执行 Python,/etc/hosts文件将被删除。看看,它有多危险?

为了证明这一点,让我们再次尝试执行input函数。

>>> dude = "thefourtheye"
>>> input("Enter your name: ")
Enter your name: input("Enter your name again: ")
Enter your name again: dude

现在,当input("Enter your name: ")被执行时,它会等待用户输入,并且用户输入是一个有效的 Python 函数调用,因此它也会被调用。这就是为什么我们Enter your name again:再次看到提示。

所以,你最好使用raw_input功能,就像这样

input_variable = raw_input("Enter your name: ")

如果您需要将结果转换为其他类型,则可以使用适当的函数来转换raw_input. 例如,要将输入读取为整数,请使用该int函数

在 python 3.x中,只有一个函数可以获取用户输入,称为input,相当于 Python 2.7 的raw_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'>)

Python 3.x

Python 3.xinput
Python 2.xraw_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'>)
2022-05-18