1.1 13条Python2.x和3.x的区别? ============================== |image0| 0. 去哪里找 ----------- 这块的内容,你随便使用搜索引擎都可以查到。 但是大家好像都在抄来抄去,内容相差无几。 授人以鱼,不如授人以渔。 在列举之前,我要先教下大家,如何找到那没有经人加工过的第一手资料。 那当然是官网啦:https://www.python.org/downloads/ 这个地址里,有所有Python历史版本(2.0+)。 点击左边,Release Version栏目 对应的版本。 |image1| 进入对应详情页后,找到如图 ``what's new in Python xx`` 就可以查看此版本的新特性。 |image2| 网页是全英文的,需要你有一定的英文阅读能力。快去感觉一下吧。 接下来。和大家一起过一下,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的正确使用方法,如下 .. code:: python # coding:utf-8 str1="中国" print str1.decode("utf-8") 亦或者可以这样,\ ``u``\ 表示,这个字符串使用Unicode编码,不再需要转换。 .. code:: python # coding:utf-8 str1=u"中国" print str1 在Python3.x中,默认使用\ ``Unicode``\ 的UTF-8编码。 所以我们可以在程序中,随意的使用中文(但并不推荐),不会报错。 3. 除法运算 ----------- Python 2.x中除法运算,整数间运算只保留整数(向下取整)。 .. code:: python >>> 8/2 4 >>> 8/3 2 >>> -8/3 -3 >>> -8/3.0 -2.6666666666666665 Python 3.x中除法运算,全部保留小数(即使能被整除)。 .. code:: python >>> 8/2 4.0 >>> 8/3 2.6666666666666665 这里要说明一下,3.x 中的\ ``//``\ 用法和 2.x 用法是一样的。这个运算叫做 ``floor`` 运算,即向下取整。 :: >>> 8//2 4 >>> 8//3 2 >>> -8//3.0 -3.0 4. 异常捕获 ----------- 在 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取消了这种奇葩的写法,直接调用构造函数抛出对象即可。 在2.x时代,异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情,在3.x中可以看出,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。 5. xrange --------- 首先,要了解的是,xrange是只有在Python2.x中才有的产物。 在 2.x 中xrange和range的使用方法可以说完全一致。只是从内部来看,range是返回一个list对象,而xrange返回一个生成器对象,所以在处理大批量数据时,xrange的性能会更好。 .. code:: python >>>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():只能接收“数字”的输入。 在3.x 中,对这两个函数进行整合,只留下一个\ ``input()``\ ,既可输入数字,也可输入字符串,返回的是字符串类型。 7. 数据类型 ----------- Python 3.x 一个很重要的特性是,对字符串和二进制数据流做了明确的区分。 文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。 Python 3不会以任意隐式的方式混用str和bytes,你不能拼接字符串和字节流,也无法在字节流里搜索字符串(反之亦然),也不能将字符串传入参数为字节流的函数(反之亦然)。 更为详细的剖析,可以前往:https://www.cnblogs.com/chownjy/p/6625299.html 还有一点是,3.X去除了long类型,取代它的是整型(int)。3.x的整型是没有限制大小的,可以当做long类型使用, 但实际上由于机器内存的有限,我们使用的整数是不可能无限大的。 8. 函数式编程 ------------- 在Python中,我们常常使用到的map,filter,reduce,在2.x和3.x中也有所不同。 在2.x中,这三货,是内建函数。返回的是一个列表。 :: >>> map >>> 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中,前面两货,却变成类了。返回的是可迭代对象。 :: >>> map >>> map(print,[1,2,3]) >>> filter >>> filter(lambda x:x % 2 == 0, range(10)) 对于 reduce 函数,它在 Python 3.x 中已经不属于 built-in 了,被挪到 functools 模块当中。 9. 协程关键字 ------------- 在Python3.3后,协程中,新增了yield from 和 async/await 关键字,这在2.x中是没有。 关于yield from的语法剖析,可以前往查看我的另一篇文章。 10. 类的类型 ------------ Python2.x 默认使用经典类,只有显示继承object才是新式类。 Python3.x 没有经典类,只有新式类,而且有三种写法 .. code:: python class Cls: pass class Cls(): pass class Cls(object): pass 11. 变量作用域 -------------- - 在2.x中无法将局部变量声明为全局变量。 - 在3.x中可以使用nonlocal语法将局部变量声明为全局变量。 .. code:: python def foo(): var=100 def bar(): nonlocal var var=200 bar() print(var) foo() # 2.x输出:100 # 3.x输出:200 12. 元类的使用 -------------- 在2.x 中 .. code:: python class Metaclass(type): pass class Person(list): __metaclass__ = Metaclass pass 在3.x中 .. code:: python class MetaPerson(type): pass class Person(metaclass=MetaPerson): pass 13. 模块变化 ------------ - 去掉了一些模块。由于不常用,这里就不列举了。 - 新增了一些模块。比如:concurrent.futures,asyncio等 - 修改了一些模块。比如:Queue改成queue。 -------------- 大概就是这些内容,可能还有更细微的差别,这些内容要前往官网查看。 但是那些对于我们普通开发者来说,并不那么重要,个人感觉可以不去关注。 -------------- |image3| .. |image0| image:: http://image.iswbm.com/20200602135014.png .. |image1| image:: http://image.iswbm.com/20190511165542.png .. |image2| image:: http://image.iswbm.com/20190511165551.png .. |image3| image:: http://image.iswbm.com/20200607174235.png