首先,raw的意思就是「未经加工的,生的」。
python 2.x 中:
raw_input() 和 input() 这两个内建函数都可以读取用户的输入来实现交互的目的,但二者存在差别。
raw_input():
顾名思义,不管用户输入的是字符还是数字,它都力求 \'原样\' 输出,因此对于用户输入的对象,该函数以字符串的形式保存下来。
何谓 \'原样\' 输出,想一下print语句的使用。对于我们想要原样打印出来的语句,我们都是放在\' \'中以字符串的形式来实现。
这里的raw_input()我们可以做类似print的理解(用户输入的就像是引号中的内容), raw_input()将接受对象以字符串的形式保存下来来实现所谓的『raw』。
1 >>> s = raw_input() 2 string 3 >>> s 4 \'string\' 5 >>> type(s) 6 <type \'str\'> 7 >>> n = raw_input() 8 123 9 >>> n 10 \'123\' 11 >>> type(n) 12 <type \'str\'> 13 >>> ss = raw_input() 14 st + ring 15 >>> ss 16 \'st + ring\' 17 >>> nn = raw_input() 18 123 + 123 19 >>> nn 20 \'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 <type \'str\'> 7 >>> n_eval = eval(n) 8 >>> n_eval 9 123 10 >>> type(n_eval) 11 <type \'int\'> 12 13 >>> nn = \'123\' + \'456\' 14 >>> eval(nn) 15 123456 16 >>> nn_eval = eval(nn) 17 >>> nn_eval 18 123456 19 >>> type(nn) 20 <type \'str\'> 21 >>> type(nn_eval) 22 <type \'int\'> 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 "<stdin>", line 1, in <module> 32 File "<string>", line 1, in <module> 33 NameError: name \'string\' is not defined 34 35 # 但是\'string\'(字符串类型)是可以value的 36 # 看一下字符串中的表达式是字符串型的eval() 37 38 >>> s = \'string\' 39 >>> s_str = s 40 >>> s = \'string\' 41 >>> s_str = \'s\' 42 >>> eval(s_str) 43 \'string\' 44 >>> type(s_str) 45 <type \'str\'> 46 >>> type(eval(s_str)) 47 <type \'str\'> 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_str 57 \'ss\' 58 >>> eval(ss_str) 59 \'string\'
有了上面的raw_input()和eval()的理解,再来玩input()就是分分钟的事,完全无压力
1 >>> s = input() 2 string 3 Traceback (most recent call last): 4 File "<stdin>", line 1, in <module> 5 File "<string>", line 1, in <module> 6 NameError: name \'string\' is not defined 7 8 >>> s = input() 9 \'string\' 10 >>> s 11 \'string\' 12 >>> ss = input() 13 \'st\' + \'ring\' 14 >>> ss 15 \'string\' 16 >>> ss = input() 17 \'st + ring\' 18 >>> ss 19 \'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 "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
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 >>> def test(): 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 is a tset 12 >>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 "<stdin>", line 1, in <module> 22 File "<stdin>", line 6, in test 23 KeyboardInterrupt
上述例子运行后While 进入死循环一直无法跳出,虽然知道是raw_input()的使用有问题,但是仍有两个问题值得探讨:
1 为什么把一个字符串去做与数字的大小比较,程序没有报错?
2 为什么进入了死循环?
因为python对字符串和int定义了比较运算的method
1 >>> \'0\' == 0 2 False 3 >>> \'0\' < 0 4 False 5 >>> \'0\' > 0 6 True 7 8 >>> \'a\' < 0 9 False 10 >>> \'a\' > 0 11 True 12 >>> \'a\' == 0 13 False
当比较字符串和数字的时候,数字永远小于字符串。所以程序没有报错,而是条件i > 100永远为真,进入了死循环。
---------------------------------------------------------------------------------------------------------------------------
进一步探讨:
上面例子只是Python2.7 版本在官方解释器CPython下 泛型问题 "object comparison" 的一个子集:
http://stackoverflow.com/questions/3270680/how-does-python-compare-string-and-int