Python2.x与 3.x 版本有哪些主要的区别?
Python 的 3.0 版本,常被称为 Python 3000 ,或简称 Py3k 。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘, Python 3 在设计的时候没有考虑向下相容,即 Python 3 和 Python 2 是不兼容的。
许多针对早期 Python 版本设计的程式都无法在 Python 3 上正常执行。为了照顾现有程式, Python 2.6 作为一个过渡版本,基本使用了 Python 2.x 的语法和库,同时考虑了向 Python 3 的迁移,允许使用部分 Python 3 的语法与函数。
新的 Python 程序建议使用 Python 3 版本的语法。 Python 3 的变化主要在以下几个方面 :
(一) print 函数
在 Python 3 中, print 语句没有了,取而代之的是 print() 函数。 Python 2.6 与 Python 2.7 部分地支持这种形式的 print 语法。在 Python 2.6 与 Python 2.7 里面,以下三种形式是等价的:
print "fish"
print ("fish") # 注意 print 后面有个空格
print("fish") #print() 不能带有任何其它参数
然而, Python 2.6 实际已经支持新的 print() 语法:
from __future__ import print_function
print("fish", "panda", sep=', ')
(二) Unicode
Python 2 有 ASCII str() 类型, unicode() 是单独的,不是 byte 类型。在 Python 3 中,有了 Unicode(utf-8) 字符串,以及一个字节类: byte 和 bytearrays 。
由于 Python3.X 源码文件默认使用 utf-8 编码,这就使得以下代码是合法的:
>>> 中国 ='china'
>>>print( 中国 )
china
Python 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'
Python 3.x
>>>str=" 我爱北京* "
>>>str
' 我爱北京* '
(三) 除法运算
Python 中的除法较其它语言显得非常高端,有套很复杂的规则。 Python 中的除法有两个运算符, / 和 // 。在 python 2.x 中,对于 / 除法,整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。在 python 3.x 中, / 除法不再这么做了,对于整数之间的相除,结果也会是浮点数。
Python 2.x:
>>>1/2
>>>1.0/2.0
0.5
Python 3.x:
>>>1/2
0.5
而对于 // 除法,这种除法叫做 floor 除法,会对除法的结果自动进行一个 floor 操作,在 python 2.x 和 python 3.x 中是一致的。
python 2.x:
>>>-1//2
-1
python 3.x:
>>>-1//2
-1
注意的是并不是舍弃小数部分,而是执行 floor 操作,如果要截取整数部分,那么需要使用 math 模块的 trunc 函数。
python 3.x:
>>>import math
>>>math.trunc(1/2)
>>>math.trunc(-1/2)
(四) 异常
在 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 中可以看出,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。
(五) xrange
在 Python 2 中, xrange() 创建迭代对象的用法是非常流行的。例如, for 循环或者是列表、集合、字典推导式。但是这个 xrange-iterable 是无穷的,意味着可以无限遍历。由于它的惰性求值,如果不得仅仅不遍历它一次, xrange() 函数比 range() 更快(比如 for 循环)。尽管如此,对比迭代一次,不建议重复迭代多次,因为生成器每次都从头开始。
在 Python 3 中, range() 是像 xrange() 那样实现以至于一个专门的 xrange() 函数都不再存在(在 Python 3 中 xrange() 会抛出命名异常)。
import timeit
n = 10000
def test_range(n):
return for i in range(n):
pass
def test_xrange(n):
for i in xrange(n):
pass
Python 2 :
print 'Python', python_version()
print '\ntiming range()'
%timeit test_range(n)
print '\n\ntiming xrange()'
%timeit test_xrange(n)
Python 2.7.6
timing range()
1000 loops, best of 3: 433 µs per loop
timing xrange()
1000 loops, best of 3: 350 µs per loop
Python 3 :
print('Python', python_version())
print('\ntiming range()')
%timeit test_range(n)
Python 3.4.1
timing range()
1000 loops, best of 3: 520 µs per loop
print(xrange(10))
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-5-5d8f9b79ea70> in <module>()
----> 1 print(xrange(10))
NameError: name 'xrange' is not defined
(六) 八进制字面量表示
八进制数必须写成 0o777 ,原来的形式 0777 不能用了;二进制必须写成 0b111 。新增了一个 bin() 函数用于将一个整数转换成二进制字串。 Python 2.6 已经支持这两种语法。
在 Python 3.x 中,表示八进制字面量的方式只有一种,就是 0o1000 。
python 2.x
>>> 0o1000
512
>>> 01000
512
python 3.x
>>> 01000
File "<stdin>", line 1
01000
^
SyntaxError: invalid token
>>> 0o1000
512
(七) 不等运算符
Python 2.x 中不等于有两种写法 != 和 <>
Python 3.x 中去掉了 <> ,只有 != 一种写法。
(八) 去掉了 repr 表达式 ``
Python 2.x 中反引号 `` 相当于 repr 函数的作用。
Python 3.x 中去掉了 `` 这种写法,只允许使用 repr 函数,这样做的目的是为了使代码看上去更清晰。
(九) 多个模块被改名(根据 PEP8 )
旧的名字 |
新的名字 |
_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() 函数。
(十) 数据类型
1 ) Py3.X 去除了 long 类型,现在只有一种整型 ——int ,但它的行为就像 2.X 版本的 long
2 )新增了 bytes 类型,对应于 2.X 版本的八位串,定义一个 bytes 字面量的方法如下:
>>> b = b'china'
>>> type(b)
<type 'bytes'>
str 对象和 bytes 对象可以使用 .encode() (str -> bytes) 或 .decode() (bytes -> str) 方法相互转化。
>>> s = b.decode()
>>> s 'china'
>>> b1 = s.encode()
>>> b1
b'china'
3) dict 的 .keys() 、 .items 和 .values() 方法返回迭代器,而之前的 iterkeys() 等函数都被废弃。同时去掉的还有 dict.has_key() , 可以用 in 来代替它 。
(十一) input 和 raw_input 函数
如果是 Python2 版本, 那么 input 和 raw_input 都可以使用 。 如果是 Python3 版本, 那么 只能使用 input() , 建议都使用 input() 。
raw_input 会将所有输入的数据作为字符串看待,返回值为字符串类型; input 输入时必须是一个合法的 Python 表达式,格式与 Python 中代码一样 , 其返回值与输入的数据类型相同 。
About Me
........................................................................................................................ ● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除 ● 本文在itpub( http://blog.itpub.net/26736162 )、博客园( http://www.cnblogs.com/lhrbest )和个人weixin公众号( xiaomaimiaolhr )上有同步更新 ● 本文itpub地址: http://blog.itpub.net/26736162 ● 本文博客园地址: http://www.cnblogs.com/lhrbest ● 本文pdf版、个人简介及小麦苗云盘地址: http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ........................................................................................................................ ● QQ群号: 230161599 (满) 、618766405 ● weixin群:可加我weixin,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友 ( 646634621 ) ,注明添加缘由 ● 于 2019-01-01 06:00 ~ 2019-01-31 24:00 在魔都完成 ● 最新修改时间:2019-01-01 06:00 ~ 2019-01-31 24:00 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ........................................................................................................................ ● 小麦苗的微店 : https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书 : http://blog.itpub.net/26736162/viewspace-2142121/ ● 小麦苗OCP、OCM、高可用网络班 : http://blog.itpub.net/26736162/viewspace-2148098/ ● 小麦苗腾讯课堂主页 : https://lhr.ke.qq.com/ ........................................................................................................................ 使用 weixin客户端 扫描下面的二维码来关注小麦苗的weixin公众号( xiaomaimiaolhr )及QQ群(DBA宝典)、添加小麦苗weixin, 学习最实用的数据库技术。 ........................................................................................................................ |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2558316/,如需转载,请注明出处,否则将追究法律责任。