ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Python2.x 与 3​​.x 版本区别

Python2.x 与 3​​.x 版本区别

.x 与 3​​.x 版本区别

这是一个常被称作3000, 或简称为Py3k的版本, 它是3​​.0版本, 相较于该早期版本而言,这是一次较大的升级。

避免带入过多累赘缘故, 3.0于设计时未将向下相容纳入考量。

有不少针对早期版本所设计的程式, 在3.0上都没办法正常执行。

2. 6 此一版本担当过渡之责, 为了妥善照料现存程式的状况这一缘故, 它于大体上采用了 2. x 的那般语法以及库, 其中同时对朝向 3. 0 的转变迁移怀有考量关注之意, 它对于使用一部分的 3. 0 的那番语法还有各项函数这事予以许可。

新的 程式建议使用 3.0 版本的语法。

除非执行起来的环境没办法去安装3.0呢, 要么就是程式自身运用了不支持3.0的第三方库。当下不被支持3.0的第三方库有, 有, PIL等等。

绝大多数第三方库都正费尽心力地与3.0版本相兼容, 縱然没办法马上运用3.0版本, 亦提议编写能与3.0版本相兼容的程序, 此后借助2.6、2.7来运行。

3.0 的变化主要在以下几个方面:

print 函数

存在着这样一种情况, print语句已不复存在, 被print() 函数所取代。并且, 2.6 与 2.7 对这种形式的print 语法只是部分地加以支持。对于2.6 与 2.7 而言, 存在着以下三种形式, 它们是等价的:

print "fish" print ("fish") # 注意print后面有个空格 print("fish") # print()不能带有任何其它参数

然而, 2.6 已然对新的 print() 语法予以支持, 其实例如下这般。

from __future__ import print_function print("fish", "panda", sep=', ')

如果在.x版本当中, 想要去使用.x的print函数, 那么是可以去导入包的, 这个包会禁用.x的print语句, 而采用.x的print函数。

有着诸多兼容性设计的那些功能, 是关于.x 与.x 的, 能够借助这个包来进行导入。

存在ASCII str()这种类型, 其中的()是独立的, 并非byte类型。

现如今, 于3这个点上, 我们最终获取到了(utf - 8)字符串, 还有一个字节类, 名为byte。

鉴于.x 源码文件在默认状况下采用的是 utf - 8 编码方式 , 故而运用中文便会显得更便利些:

>>> 中国 = 'china' >>>print(中国) china

2.x

>>> str = "我爱北京天安门" >>> str '\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8' >>> str = u"我爱北京天安门" >>> str u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8'

3.x

>>> str = "我爱北京天安门" >>> str '我爱北京天安门'

除法运算

中的除法, 相较于其它语言呈现出很是特别的高端态势, 有着一套极为繁杂的规则。其除法存在两个运算符, 一个是 / , 另一个是 //。

首先来说 / 除法:

在2.x里, 除法和我们熟知的多数语言, 像Java与C那样, 整数相除时其结果是个整数, 会将小数部分全然忽略掉, 而浮点数除法会留存小数点部分从而得出一个浮点数的结果。

在3.x里, 除法操作不再采用以往方式, 整数之间进行相除时,得出的结果将会是浮点数。

2.x:

>>> 1 / 2 0 >>> 1.0 / 2.0 0.5

3.x:

>>> 1/2 0.5

对于除法而言, 这种被称作floor除法的除法, 会对除法结果自动施行一个floor操作, 在2.x里是这样, 在3.x中也是如此, 保持一致。

2.x:

>>> -1 // 2 -1

3.x:

>>> -1 // 2 -1

有需注意的情况, 并不是将小数部分舍弃掉这种做法, 而是要执行floor操作, 要是想要截取整数部分, 那么就得运用math模块的trunc函数。

3.x:

>>> import math >>> math.trunc(1 / 2) 0 >>> math.trunc(-1 / 2) 0

异常

在3当中, 处理异常的情况也有了些许轻微的变革。在3 里, 如今我们启用 as 充当关键词。

捕获异常的语法, 从exc, var, 变更为exc as var!

运用语法 (exc1, exc2) 当作 var 的方式, 能够同时捕捉多种类别的异常, 2.6 已然支持这两种语法。

在2.x时期, 异常于代码里, 除了用以表明程序错误之外, 还常常会去做一些普通控制结构理应做的事儿。在3.x当中, 能够看得出来, 设计者让异常变得更为专一, 唯有在发生错误的这个情况下, 才能够运用异常捕获语句去进行处理。

2.x: 异常处理语法使用逗号。

try: # code except Exception, e: print e

3.x: 异常处理语法使用 as。

try: # code except Exception as e: print(e)

() 和 range()

2.x , range() 所返回的是一个列表 ,然而 () 的返回物却是一个生成器 , 其在节省内存方面表现更为突出。

range(5) # 返回 [0, 1, 2, 3, 4] xrange(5) # 返回 xrange 对象,按需生成数字

3.在x的情况下, 括号内的内容被移除, 之后range函数才返回具有节省内存属性的称作生成器的那样东西, 可以节省那部分内存。

range(5) # 返回一个迭代器,按需生成数字

八进制字面量表示

必须把八进制数写成 0o777 的样子没错, 原来那种 0777 的形式不能再用了, 二进制必须写成 0b111 形式。

一个用于把整数转成二进制字串的 bin() 函数被新增了, 2.6 已对两种语法给予支持。

在 3.x中,表示八进制字面量的方式只有一种,就是。

2.x

>>> 0o1000 512 >>> 01000 512

3.x

>>> 01000 File "", line 1 01000 ^ SyntaxError: invalid token >>> 0o1000 512

不等运算符

2.x中不等于有两种写法 != 和

3.将x去掉了, 仅剩下!=这一种写法, 还好, 我一直都没有使用它的习惯、。

去掉了repr表达式``

2.x 中反引号``相当于repr函数的作用

3.x 中将``这种写法给去掉了, 仅允许使用 repr 函数, 如此做的目的是要让代码看起来更清晰吗? 然而我觉得使用 repr 的机会是很少的, 通常只是在 debug 的时候才会使用, 大多数情况下还是使用 str函数来用字符串去描述对象。

def sendMail(from_: str, to: str, title: str, body: str) -> bool: pass

多个模块被改名(根据PEP8)旧的名字新的名字

Queue

queue

repr

模块现今被整合进新的io模组当中, new、md5这样的模块被移除, 2.6已然支持新的io模组。

, , , , , 被合并到http包内。

当初将exec语句废除了, 如今仅留存exec()函数。在2.6版本里, 已然对exec()函数予以支持了。

5.数据类型

1)Py3.X把long类型给去除掉了, 如今仅仅存在一种整型, 那就是int, 然而它的行为跟2.X版本的long是一样的。

2)新添了bytes类型, 它与2.X版本的八位串相对应, 定义一个bytes字面量的方式如下:

>>> b = b'china' >>> type(b)

字符串对象以及字节序列对象能够运用将字符串转为字节序列的方法, 或者运用将字节序列转为字符串的方法来彼此进行转化。

>>> s = b.decode() >>> s 'china' >>> b1 = s.encode() >>> b1 b'china'

3)dict的.keys()方法返回迭代器, dict的.items方法返回迭代器, dict的.();方法返回迭代器, 在此之前的()等多个函数依据相关规定都被废弃, 同时被去掉的还有dict.();, 现在请使用in来替代它。

6.标准库重组

3.x : 存在一些模块, 它们被进行了重新组织, 或者被进行了重命名。举例而言 , 其中的 、 被合并成为了。

# Python 2.x import urllib import urlparse # Python 3.x import urllib.parse

7.函数的 () 和 items()

2.x: 字典存在 items() 以及 () 方法, items() 会返回一个列表, () 会返回一个迭代器。

d = {'a': 1, 'b': 2} d.items() # 返回 [('a', 1), ('b', 2)] d.iteritems() # 返回字典的迭代器

3.x: 被移除的那个东西, items() 所返回的呈现为一个字典视图的玩意儿, 也就是那一个迭代器。

d = {'a': 1, 'b': 2} d.items() # 返回 dict_items([('a', 1), ('b', 2)])

8. 模块的 支持

3.x: 诸多2.x特性已被拿掉, 2.x用户要是想在代码里预先运用3.x的行为, 能够借助导入达成兼容。

from __future__ import print_function

9. 字典的排序

2.x: 字典是无序的(没有保证顺序)。

3.x: 字典是有序的,按照插入顺序保留元素。

10. next() 方法

2.x , next()属于一个函数, 其一般而言与 iter()一块儿被使用。

3.x: next()属于内建函数, 其用法跟2.x一样, 然而它的参数不一样, 在3.x里, 支持借助next(, )去设置默认值。

返回列表