现在python的主流版本是python3,但是也不难看到好多的程序是用python2写的,当然,面试的时候也会有人经常问到这两者的区别在哪了,之前遇到这个问题,就只是说,一直在用python3,所以对python2不怎么了解,但是不免是一种减分的回答,这里就将两者的区别总结一下,希望下次能够从容面对这个问题。
两者的区别就在于一部分库的迁移,还有一些用方法在用法上的改变,主要有一下几点:
1、print函数的用法:
这个估计大家都能注意到,就是python2的print函数没有括号,很简单,不再赘述
2、Unicode:
python2中代码对中文的支持并没有那么友好,所以会在开始写程序之前要先定义一下编码类型,但是3中默认就是utf-8,是支持中文的。
3、除法运算:
2中整数之间相除,结果会把小数部分完全忽略掉,但是3中会保留小数部分
4、异常:
在 Python 3 中处理异常也轻微的改变了,在 Python 3 中我们现在使用 as 作为关键词。
捕获异常的语法由 except exc, var 改为 except exc as var。
使用语法except (exc1, exc2) as var可以同时捕获多种类别的异常。 Python 2.6已经支持这两种语法。
- 1. 在2.x时代,所有类型的对象都是可以被直接抛出的,在3.x时代,只有继承自BaseException的对象才可以被抛出。
- 2. 2.x raise语句使用逗号将抛出对象类型和参数分开,3.x取消了这种奇葩的写法,直接调用构造函数抛出对象即可。
在2.x时代,异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情,在3.x中可以看出,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。
5、xrange:
2中有range和xrange两个函数,再3中只有range一个,相当于2中的xrange,是一个生成器。
6、不等运算符:
2中不等运算符有两种写法,!=和<>,但是在3中取消了<>这种写法。
7、模块改名:
旧的名字 | 新的名字 |
---|---|
_winreg | winreg |
ConfigParser | configparser |
copy_reg | copyreg |
Queue | queue |
SocketServer | socketserver |
repr | reprlib |
StringIO模块现在被合并到新的io模组内。 new, md5, gopherlib等模块被删除。 Python 2.6已经支援新的io模组。
httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包内。
取消了exec语句,只剩下exec()函数。 Python 2.6已经支援exec()函数。
8、数据类型:
3去除了long类型,只有一个int,新增了bytes类型。str类型和bytes类型可以相互转化。
9、input函数
2的用法是raw_input,3中变成input
10、打开文件:
2的用法是file()或者open(),但是在3中只有open()
11、map 、filter、reduce
从原来的内置函数变成了类,reduce更是从内置函数变成了function_tools
以上这些就是两个版本的部分变化,当然实际上应该会更多,如果有补充欢迎留言讨论一下。