python中的input()和raw_input()

首先,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

 

转载于:https://www.cnblogs.com/betame/p/5049399.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值