Python2.x与3.x版本有哪些主要的区别?


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, 学习最实用的数据库技术。

Python2.x与3.x版本有哪些主要的区别?

........................................................................................................................

Python2.x与3.x版本有哪些主要的区别? Python2.x与3.x版本有哪些主要的区别?

 

 




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2558316/,如需转载,请注明出处,否则将追究法律责任。

上一篇:【算法图解】学习笔记


下一篇:Python2.x与3​​.x版本区别Ⅱ