1 简介
内建函数input()与内建函数raw_input()均是在__builtin__模块中定义的两个函数,两者均可用来从控制台获取用户输入信息以便操作。python 中使用help()函数分别对两者进行解读后发现:
(1)input()函数返回值是数字类型的数据。raw_input()函数返回值是字符串类型的数据,即用户输入的数据类型,均会以字符串的形式返回,当用户输入EOF(Unix:Ctrl-D,Windows:Ctrl-Z+Return)时,将会导致EOF错误。为方便理解,举两个简单的例子。
>>> user_name=raw_input("Please enter your name:")
Please enter your name:zhang san
>>> user_name
'zhang san'
>>>
使用raw_input()获取用户输入时,比较符合常人思维,在输入时不需要对输入信息做任处理。但是使用input()函数执行上述操作时,会出现错误:
>>> user_name=input("Please enter your name:")
Please enter your name:zhang san
Traceback (most recent call last):
File "", line 1, in
user_name=input("Please enter your name:")
File "", line 1
zhang san
^
SyntaxError: unexpected EOF while parsing
如果想实现raw_input()函数输入字符串的功能,则使用input()时需要做以下修改:
>>> user_name=input("Please enter your name:")
Please enter your name:"zhang san"
>>> user_name
'zhang san'
(2)使用input()函数进行表达式输入时可以直接得到表达式的结果,但是会提示EOF Error,而使用raw_input()可以进行表达式输入且不会提示错误。例如:
add=input(10+20)
30
Traceback (most recent call last):
File "", line 1, in
add=input(10+20)
File "", line 0
^
SyntaxError: unexpected EOF while parsing
>>> add=raw_input(10+20)
30
(3)在进行数字值输入时,使用raw_input()函数获取到的值会自动以字符串的形式输出,input()函数获取的值则仍然是原来的数值,不需要做转换处理。例如:
>>> number1=raw_input("please input a number:")
please input a number:10
>>> number1
'10'
>>> number1=input("please input a number:")
please input a number:10
>>> number1
10
>>> number2=raw_input("please input a float number:")
please input a float number:3.14
>>> number2
'3.14'
>>> number2=input("please input a float number:")
please input a float number:3.14
>>> number2
3.14
3.input()函数的实际源代码如下:
def input(prompt):
return eval(raw_input(prompt))
可见input()函数内部调用了raw_input()函数,而raw_input()函数的返回值又作为eval()函数的参数,那么eval()函数有何作用呢?
>>> help(eval)
Help on built-in function eval in module __builtin__:
eval(...)
eval(source[, globals[, locals]]) -> value
Evaluate the source in the context of globals and locals.
The source may be a string representing a Python expression
or a code object as returned by compile().
The globals must be a dictionary and locals can be any mapping,
defaulting to the current globals and locals.
If only globals is given, locals defaults to it.
由此可知,input()函数在数值输入时之所以可以得到数据类型相同的数据,而不是字符串类型的数据,其实际是eval()函数做了字符串到数值(整型、浮点型等)的转换而已。