想必现在大家学习Python都会用3.0及以上的版本了,虽然2.X的版本依然很多,但是这两年随着部分开源项目不再支持2.X版本,3.X已经成为趋势。
正是在这样的大背景下,我最近用这本《Python基础教程》做教材的时候,发现作者的语句主要是基于Python 2.5版本写成的,2014年进行第二版修订的时候,也没有明确出2.X与3.X的区别,但是现在这些语句会对使用3.X版本的初学者朋友引起误导,下面我就随着这本书的使用过程,更新一下遇到的一些问题,希望遇到问题的初学者们不要感到困扰。
首先说一下教材的信息,因为版本很重要
《Python基础教程(第2版 修订版)》 ISBN:9787115353528
问题及解决思路如下,不断更新,我也是新人,望批评指正。
1.关于input和raw_input
在1.11.4节(21页)提到input和raw_input的比较,但是在3.X的Python版本中,已经用input代替了raw_input了,本小节最后还特别提醒“除非对input有特别的需要,否则应该尽可能使用raw_input函数”,这句话可能在2.X的版本中适用,但是在3.X的版本是无效的,在这里应该单独点一下两个版本在这两个函数上的差异呢,而不是直接提倡用raw_input函数,因为在3.X版本中raw_input已经不存在了。
2.关于print
print在3.X的版本中print已经成为一个函数,因此直接用 print “Hello,World!”此类的语句,就会报错了,望初学者注意,要用print(参数),同样的,exce在Python3.X的版本中同print有相同的变化,作为函数使用,同样exce使用方式也发生了此类变化。
关于print,作为函数使用,其实与C语言的printf()函数的使用方式类似,只是Python里的函数使用方式更加灵活多变。
通过help(print)可以看到print函数的参数列表如下所示:
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
其中value是输入值,可以有多个参数,传递到print函数里面是作为元祖(param1,param2,……)处理的,之后的几个关键词函数参数分别控制着输出格式等。
sep:指定前面传入的一系列参数之间用什么符号连接,默认是空格
end:指定输出后最后一个字符是什么,默认是换行符,但是可以根据实际情况设置不换行为空或者其它特殊符号等,这也解决了Python2经常print输出自动换行不容易控制的问题
file:指定输出内容到哪个文件中,默认就是输出到当前的标准输出流里。
flush:用来指示缓存的开关标志,默认为False,既输出在内存缓存里,不刷新到文件中,当值为True时,输出的内容会立即刷新到输出文件中。
3.内建函数cmp
cmp内建函数在Python 3.X中已经被删除了,被operator模块中的函数代替,如果想做比较功能,可以考虑导入operator模块,用以下函数实现:
1 operator.lt(a, b)2 operator.le(a, b)3 operator.eq(a, b)4 operator.ne(a, b)5 operator.ge(a, b)6 operator.gt(a, b)7 operator.__lt__(a, b)8 operator.__le__(a, b)9 operator.__eq__(a, b)10 operator.__ne__(a, b)11 operator.__ge__(a, b)12 operator.__gt__(a, b)
lt(a, b) 相当于 a < b #less than 小于
le(a,b) 相当于 a <= b #less than or equal 小于等于
eq(a,b) 相当于 a == b #equal 等于
ne(a,b) 相当于 a != b #not equal 不等于
ge(a, b)相当于 a>= b #greater equal 大于等于
gt(a,b) 相当于 a > b #greater than 大于
这些函数的返回值为布尔值
4.关于字符串格式化的问题
这个问题只是在这里简单一提,详细的使用方法大家可以去参照文档的介绍或者Google
Python 2.X中使用从C语言借鉴来的格式化方法,如 "%s %d %f" % (str, int , float)这个样式,在Python 3.X的版本中,为了更灵活的使用Python的数据结构(列表、元祖、字典、集合),新版本中推荐使用format函数进行字符串格式化,也更加灵活了,具体使用大家自己查查资料。
5.关于字典的方法has_key()
Python 3.X的版本中,判断字典中是否含有某个键时,已经无法使用has_key()的方式,只能用in,如‘name’ in d,另外,in的效率也比has_key()的效率高,因为不管是为了代码兼容还是效率问题,推荐使用in。
6.关于范围函数range()与xrange()
在Python 3.X中,range被转换成xrange风格的函数,因此xrange在3.X的版本中就没有存在的必要了,直接用range就行。
7.数据类型long
在Python3.X的版本中,long类型已经不存在了,老int和long的范围统一使用int表示,可以进行高精度运算。