首先,raw的意思就是「未经加工的,生的」。
python 2.x 中:
raw_input() 和 input() 这两个内建函数都可以读取用户的输入来实现交互的目的,但二者存在差别。
raw_input():
顾名思义,不管用户输入的是字符还是数字,它都力求 "原样" 输出,因此对于用户输入的对象,该函数以字符串的形式保存下来。
何谓 "原样" 输出,想一下print语句的使用。对于我们想要原样打印出来的语句,我们都是放在" "中以字符串的形式来实现。
这里的raw_input()我们可以做类似print的理解(用户输入的就像是引号中的内容), raw_input()将接受对象以字符串的形式保存下来来实现所谓的『raw』。
1 >>> s =raw_input()2 string3 >>>s4 "string"
5 >>>type(s)6
7 >>> n =raw_input()8 123
9 >>>n10 "123"
11 >>>type(n)12
13 >>> ss =raw_input()14 st +ring15 >>>ss16 "st + ring"
17 >>> nn =raw_input()18 123 + 123
19 >>>nn20 "123 + 123"
input():
Help on built-in function input in module __builtin__:
input(...)
input([prompt])->value
Equivalent to eval(raw_input(prompt)).
如上,通过help(input)不难发现input()本身是由 raw_input()来实现的,input()会对用户输入的内容 "自作聪明" 地去eval()一下。
因此只要搞清eval()这个函数就可以玩透input(), eval()就是要拿出字符串中的表达式的value, 而input ()相当于 eval(raw_input()),
因此 input() 就是在对用户输入的对象『raw』一下得到了一个字符串的基础上,再拿出得到的字符串中的表达式的value。
Talk is cheap, show the code!
1 #看一下字符串中表达式是数值型的eval()
2 >>> n = "123"
3 >>>eval(n)4 123
5 >>>type(n)6
7 >>> n_eval =eval(n)8 >>>n_eval9 123
10 >>>type(n_eval)11
12
13 >>> nn = "123" + "456"
14 >>>eval(nn)15 123456
16 >>> nn_eval =eval(nn)17 >>>nn_eval18 123456
19 >>>type(nn)20
21 >>>type(nn_eval)22
23 >>> nn_another_mode = "123 + 456"
24 >>>eval(nn_another_mode)25 579
26
27 #注意下面这个错误,这个错误说明string(类型不知)是无法value出来的
28 >>> s = "string"
29 >>>eval(s)30 Traceback (most recent call last):31 File "", line 1, in
32 File "", line 1, in
33 NameError: name "string" is notdefined34
35 #但是"string"(字符串类型)是可以value的
36 #看一下字符串中的表达式是字符串型的eval()
37
38 >>> s = "string"
39 >>> s_str =s40 >>> s = "string"
41 >>> s_str = "s"
42 >>>eval(s_str)43 "string"
44 >>>type(s_str)45
46 >>>type(eval(s_str))47
48
49 >>> ss = "st + ring"
50 >>> ss_str = "ss"
51 >>>eval(ss_str)52 "st + ring"
53 >>>
54 >>> ss = "st" + "ring"
55 >>> ss_str = "ss"
56 >>>ss_str57 "ss"
58 >>>eval(ss_str)59 "string"
有了上面的raw_input()和eval()的理解,再来玩input()就是分分钟的事,完全无压力
1 >>> s =input()2 string3 Traceback (most recent call last):4 File "", line 1, in
5 File "", line 1, in
6 NameError: name "string" is notdefined7
8 >>> s =input()9 "string"
10 >>>s11 "string"
12 >>> ss =input()13 "st" + "ring"
14 >>>ss15 "string"
16 >>> ss =input()17 "st + ring"
18 >>>ss19 "st + ring"
小结:
在 Python2.x 中 关于这两个输入函数 常见的错误无非两种:
1 number = raw_input("enter a number please: ") 这里再please也没用, 正确做法:
number = int(raw_input("enter a number please: ")) 该 float 就换成float()
2 用过Python3.x 转到Python2.x 的时候,一不小心 name = input("enter a name for the file, please: ")
Traceback (most recent call last):
File "", line 1, in
File "", line 1, in
NameError: name "whatever you input" is not defined
这个时候把输入的内容加上引号就可以了,或许你可以使用raw_input()
那是因为
Python 3.x
没有raw_input() 了,只有input(), 但是用法功能却跟Python2.x中的raw_input() 一样。
--------------------------------------------------------------------------------------------------2016-01-07 补充:
1 >>>
2 >>> deftest():3 ... print "this is a tset"
4 ... i = raw_input(">>")5 ... while i < 0 or i > 100:6 ... print "wrong number!"
7 ... i = raw_input(">>")8 ... print"done!"
9 ...10 >>>test()11 this isa tset12 >>100
13 wrong number!14 >>33
15 wrong number!16 >>2
17 wrong number!18 >>
19 wrong number!20 >>Traceback (most recent call last):21 File "", line 1, in
22 File "", line 6, intest23 KeyboardInterrupt
上述例子运行后While 进入死循环一直无法跳出,虽然知道是raw_input()的使用有问题,但是仍有两个问题值得探讨:
1 为什么把一个字符串去做与数字的大小比较,程序没有报错?
2 为什么进入了死循环?
因为python对字符串和int定义了比较运算的method
1 >>> "0" ==02 False3 >>> "0" <04 False5 >>> "0" >06 True7
8 >>> "a" <09 False10 >>> "a" >011 True12 >>> "a" ==013 False
当比较字符串和数字的时候,数字永远小于字符串。所以程序没有报错,而是条件i > 100永远为真,进入了死循环。
---------------------------------------------------------------------------------------------------------------------------
进一步探讨:
上面例子只是Python2.7 版本在官方解释器CPython下 泛型问题 "object comparison" 的一个子集: