Python2.x和3.x到底有哪些区别,这不仅在你开发过程中需要考虑的,也是面试过程面试官经常会问及的 。
1. print在Python 2.6之前,只支持
print "hello"在Python 2.6和2.7中,可以支持如下三种
print "hello"print("hello")print ("hello")在Python3.x中,可以支持如下两种
print("hello")print ("hello")2. 编码方式在Python2.x中,默认使用ASCII编码 。
所以默认情况下,我们不能在程序中使用中文 。若要使用中文,必须在文件头部,声明使用 "UTF-8" 编码,并在使用的时候注意编码转换,要打印的时候需先转成"Unicode"编码,否则会乱码 。
Python 2的正确使用方法,如下
# coding:utf-8str1="中国"print str1.decode("utf-8")亦或者可以这样,u表示,这个字符串使用Unicode编码,不再需要转换 。
# coding:utf-8str1=u"中国"print str1在Python3.x中,默认使用Unicode的UTF-8编码 。
所以我们可以在程序中,随意的使用中文(但并不推荐),不会报错 。
3. 除法运算Python 2.x中除法运算,整数间运算只保留整数(向下取整) 。
'''学习中遇到问题没人解答?小编创建了一个Python学习交流群:531509025寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!'''>>> 8/24>>> 8/32>>> -8/3-3>>> -8/3.0-2.6666666666666665Python 3.x中除法运算,全部保留小数(即使能被整除) 。
>>> 8/24.0>>> 8/32.6666666666666665这里要说明一下,3.x 中的//用法和 2.x 用法是一样的 。这个运算叫做 floor 运算,即向下取整 。
>>> 8//24>>> 8//32>>> -8//3.0-3.04. 异常捕获在 Python 3 中,只能使用 as 作为关键词 。而在Python 2中经常使用 except Exception, e
使用语法except (exc1, exc2) as var可以同时捕获多种类别的异常 。
Python 2.6已经支持这两种语法 。
- 在2.x时代,所有类型的对象都是可以被直接抛出的,在3.x时代,只有继承自BaseException的对象才可以被抛出 。
- 2.x raise语句使用逗号将抛出对象类型和参数分开,3.x取消了这种奇葩的写法,直接调用构造函数抛出对象即可 。
5. xrange首先,要了解的是,xrange是只有在Python2.x中才有的产物 。
在 2.x 中xrange和range的使用方法可以说完全一致 。只是从内部来看,range是返回一个list对象,而xrange返回一个生成器对象,所以在处理大批量数据时,xrange的性能会更好 。
>>>xrange(1,5)xrange(1, 5)>>>list(xrange(1,5))[1, 2, 3, 4]而在3.x 中,只有range函数,为什么没有xrange,因为3.x中的range其实就是2.x中的xrange 。你可以这样理解 。>>> range(10)range(0, 10)6. 用户输入在2.x 中,有两个函数 。raw_input()和input() 。raw_input():将所有输入作为字符串看待,返回字符串类型 。- input():只能接收"数字"的输入 。
7. 数据类型Python 3.x 一个很重要的特性是,对字符串和二进制数据流做了明确的区分 。
文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示 。
Python 3不会以任意隐式的方式混用str和bytes,你不能拼接字符串和字节流,也无法在字节流里搜索字符串(反之亦然),也不能将字符串传入参数为字节流的函数(反之亦然) 。
还有一点是,3.X去除了long类型,取代它的是整型(int) 。3.x的整型是没有限制大小的,可以当做long类型使用,但实际上由于机器内存的有限,我们使用的整数是不可能无限大的 。
8. 函数式编程在Python中,我们常常使用到的map,filter,reduce,在2.x和3.x中也有所不同 。
在2.x中,这三货,是内建函数 。返回的是一个列表 。
>>> map<built-in function map>>>> filter<built-in function filter>>>> map(lambda x:x *2, [1,2,3])[2, 4, 6]>>> filter(lambda x:x %2 ==0,range(10))[0, 2, 4, 6, 8]在3.x中,前面两货,却变成类了 。返回的是可迭代对象 。'''学习中遇到问题没人解答?小编创建了一个Python学习交流群:531509025寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!'''>>> map<class 'map'>>>> map(print,[1,2,3])<map object at 0x10d8bd400>>>> filter<class 'filter'>>>> filter(lambda x:x % 2 == 0, range(10))<filter object at 0x10d8bd3c8>对于 reduce 函数,它在 Python 3.x 中已经不属于 built-in 了,被挪到 functools 模块当中 。9. 协程关键字在Python3.3后,协程中,新增了yield from 和 async/await 关键字,这在2.x中是没有 。
关于yield from的语法剖析,可以前往查看我的另一篇文章 。
10. 类的类型Python2.x 默认使用经典类,只有显示继承object才是新式类 。
Python3.x 没有经典类,只有新式类,而且有三种写法
class Cls:passclass Cls():passclass Cls(object):pass11. 变量作用域在2.x中无法将局部变量声明为全局变量 。在3.x中可以使用nonlocal语法将局部变量声明为全局变量 。
'''学习中遇到问题没人解答?小编创建了一个Python学习交流群:531509025寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!'''def foo():var=100def bar():nonlocal varvar=200bar()print(var)foo()# 2.x输出:100# 3.x输出:20012. 元类的使用在2.x 中class Metaclass(type):passclass Person(list):__metaclass__ = Metaclasspass在3.x中class MetaPerson(type):passclass Person(metaclass=MetaPerson):pass13. 模块变化【1月13日新闻总结 总结了13条:Python2.x与3.x之间的区别】去掉了一些模块 。由于不常用,这里就不列举了 。新增了一些模块 。比如:concurrent.futures,asyncio等
修改了一些模块 。比如:Queue改成queue 。
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
