为什么在下面的代码中是x和字符串而不是整数?y
x
y
(注意:在 Python 2.x 中使用raw_input(). 在 Python 3.x 中使用 . 在 Python 3.xinput()中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 开始,input返回一个字符串,您必须将其显式转换为ints, with int, 像这样
input
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.
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:
float
x = float(input("Enter a number:"))
概括
raw_input
Python 2.x
有两个函数可以获取用户输入,称为input和raw_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
5 + 17
22
data
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.
dude
thefourtheye
input_variable
如果我输入当前 python 上下文中不存在的其他内容,它将失败NameError。
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
import os
os.remove("/etc/hosts")
这将被python评估为函数调用表达式,并将被执行。如果您使用提升的权限执行 Python,/etc/hosts文件将被删除。看看,它有多危险?
/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:再次看到提示。
input("Enter your name: ")
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'>)