首页_biseivan个人博客 - 一个追梦少年的个人博客网站

您现在的位置是:首页 > 学无止境 > python|shell|linux 网站首页学无止境

python2与python3的区别

简介 python3对python2一些改变是...

前记:python3对python2一些改变是:将一些内置函数由python2时返回列表变为python3返回迭代器(生成器)对象。python3对其改进的原因是迭代器的惰性求值特性(迭代器不会在它被绑定到变量之后就立即求值,而是等用到时再求值),这个特性可以解决一些巨大甚至无限的集合列表,如菲波那切数列、几十G的文件等等(内存开销太大,非常容易爆),惰性求值可以解决这个问题。

从Python2到Python3,很多基本的函数接口变了,甚至是,有些库或函数被去掉了或者改名了
第三方库的支持方面,目前来说,还是Python2支持的最好,Python3支持的不太够

1.print:

python2 print可以不加括号(为print语句);python3必须加括号(print为函数)。要在python2中以函数形式使用print,则应:from __future__ import print_function

2、input:

python2 分raw_input() 和input两个函数,raw_input()使键盘输入转化为字符串,而input()函数则不进行字符串转化;python3只有input()函数,作用是直接将键盘输入转化为字符串。

3、dict字典操作:

python2中有has_key(key)来判断字典中是否存在指定键,而python3中被__contains__(key)函数取代(用key in dict 更pythonic)

4、range():

python2 中range()返回一个整数列表,xrange()返回的是迭代器对象。而python3中range()返回一个整数序列对象(返回迭代器对象),可以使用list()函数转换成列表类型

5、一些内置函数(map,filter等):

如map,filter等内置函数在python2中返回类型为列表,python3返回的是迭代器对象。

6、编码:

python2使用asscii进行编码(python诞生时还没有utf-8),python3使用utf-8编码。因此python3可以不用申明默认编码(具体编解码我也很混乱,先放放)

7、/除法:

python2除号“/”直接截断除,如5/2=2, 若不想截断除则应声明from __future__ import division,这样5/2=2.5;而python3 中除号“/”不发生截断,如5/2=2.5,若想截断除则应使用“//”,如5//2=2

8、容器数据类型属性变化:

字典类型dict,在python2中的实现是基于hash表,所以是无序的,若要有序需要使用collections.OrderedDict;而python3.6后改写了字典的内部算法,所以python3.6后是有序的(遵循的顺序是Key的插入顺序。也就是说需要用一定顺序插入才能获得排好的结果,否则依然需要sort)。

9、(新式类继承)子类继承父类方法的super():

python2.* 的调用方式为 super(Class[, object or type]).method()例如 B类继承A类 在B类中继承方式为 super(B, self).a_method();而python3.*的调用方式可以直接写为 super().method()

10、一些第三方包的差异(如PIL与pillow;pickle序列化的不兼容)

在第三方包的差异上,以PIL和pillow为例,PIL为python2.x的图像包,该包日久失修,在python3.x中便不再支持,大家开发了可兼容python2PIL的pillow;python2使用cpickle,而python3使用pickle,且将pickle集成到了python3 的标准库中(互相 直接 读取生成的序列化文件不兼容,需要处理,如python3 load python2 序列化出的数据时,在load时指定latin1编码:pickle.load(file_handle,encoding='latin1'),其中file_handle是通过二进制读的方式读取的)。

11、数据类型的差异(长整型)

在python2中如果数字很大会自动由int类型转为long类型,或者在数字后加L(如199L)定义long整型,而python3中Python 3里,只有一种整数类型 int,它本身表示为长整型。

文章评论

Top