python2 与 python3的区别.docx

上传人:b****4 文档编号:4062746 上传时间:2023-05-06 格式:DOCX 页数:18 大小:24.02KB
下载 相关 举报
python2 与 python3的区别.docx_第1页
第1页 / 共18页
python2 与 python3的区别.docx_第2页
第2页 / 共18页
python2 与 python3的区别.docx_第3页
第3页 / 共18页
python2 与 python3的区别.docx_第4页
第4页 / 共18页
python2 与 python3的区别.docx_第5页
第5页 / 共18页
python2 与 python3的区别.docx_第6页
第6页 / 共18页
python2 与 python3的区别.docx_第7页
第7页 / 共18页
python2 与 python3的区别.docx_第8页
第8页 / 共18页
python2 与 python3的区别.docx_第9页
第9页 / 共18页
python2 与 python3的区别.docx_第10页
第10页 / 共18页
python2 与 python3的区别.docx_第11页
第11页 / 共18页
python2 与 python3的区别.docx_第12页
第12页 / 共18页
python2 与 python3的区别.docx_第13页
第13页 / 共18页
python2 与 python3的区别.docx_第14页
第14页 / 共18页
python2 与 python3的区别.docx_第15页
第15页 / 共18页
python2 与 python3的区别.docx_第16页
第16页 / 共18页
python2 与 python3的区别.docx_第17页
第17页 / 共18页
python2 与 python3的区别.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

python2 与 python3的区别.docx

《python2 与 python3的区别.docx》由会员分享,可在线阅读,更多相关《python2 与 python3的区别.docx(18页珍藏版)》请在冰点文库上搜索。

python2 与 python3的区别.docx

python2与python3的区别

python2与python3的区别

几乎所有的python2程序都需要一些修改才能正常的运行在python3的环境下。

为了简化这个转换过程,Python3自带了一个2to3的实用脚本.这个脚本会将python2程序源文件作为输入,然后自动转换到python3.但并不是所有内容都可以自动转换。

print语句

python2中print是一个语句,不论想输出什么,直接放到print关键字后面即可。

python3里,print()是一个函数,像其他函数一样,print()需要你将要输出的东西作为参数传给它。

python2

python3

备注

print

print()

输出一个空白行,python3需要调用不带参数的print()

print1

print

(1)

输出一个值,将值传入print()函数

print1,2

print(1,2)

输出使用空格分割的两个值,使用两个参数调用print()

print1,2,

print(1,2,end='')

python2中如果使用一个,作为print结尾,将会用空格分割输出的结果,然后在输出一个尾随的空格,而不输回车。

python3里,把end=''作为一个关键字传给print()可以实现同样的效果,end默认值为'\n',所以通过重新指定end参数的值,可以取消在末尾输出回车符号

print>>sys.stderr,1,2,3

print(1,2,3,file=sys.stderr

python2中,可以通过>>pipe_name语法,把输出重定向到一个管道,比如sys.stderr.在python3里,可以通过将管道作为关键字参数file的值传递给print()完成同样的功能。

UNICODE字符串

python2中有两种字符串类型:

Unicode字符串和非Unicode字符串。

Python3中只有一种类型:

Unicode字符串。

python2

python3

备注

u'PapayaWhip'

'PapayaWhip'

python2中的Unicode字符串在python3即为普通字符串

ur'PapayaWhip\foo'

r'PapayWhip\foo'

Unicode原始字符串(使用这种字符串,python不会自动转义反斜线"\")也被替换为普通的字符串,因为在python3里,所有原始字符串都是以unicode编码的。

全局函数UNICODE()

python2有两个全局函数可以把对象强制转换成字符串:

unicode()把对象转换成unicode字符串,还有str()把对象转换为非Unicode字符串。

Python3只有一种字符串类型,unicode字符串,所以str()函数即可完成所有的功能。

LONG长整型

python2有非浮点数准备的int和long类型。

int类型最大值不能超过sys.maxint,而且这个最大值是平台相关的。

可以通过在数字的末尾附上一个L来定义长整型,显然,它比int类型表示的数字范围更大。

在python3里,只有一种整数类型int,大多数情况下,和python2中的长整型类似。

python2

python3

备注

python2中的十进制长整型在python3中被替换为十进制普通整数

x=0xFFFFFFFFFFFFL

x=0xFFFFFFFFFFFF

python2里的十六进制长整型在python3里被替换为十六进制的普通整数

long(x)

int(x)

python3没有long()

type(x)islong

type(x)isint

python3用int判断是否为整型

isinstance(x,long)

isinstance(x,int)

int检查整数类型

<>比较运算符

Python2支持<>作为!

=的同义词, python3只支持!

=,不再支持<>

字典类方法HAS_KEY()

Python2中,字典对象has_key()方法测试字典是否包含指定的键。

python3不再支持这个方法,需要使用in.

返回列表的字典类方法

在python2里,许多字典类方法的返回值是列表。

最常用方法有keys,items和values。

python3,所有以上方法的返回值改为动态试图。

在一些上下文环境里,这种改变不会产生影响。

如果这些方法的返回值被立即传递给另外一个函数,而且那个函数会遍历整个序列,那么以上方法的返回值是列表或视图并不会产生什么不同。

如果你期望获得一个被独立寻址元素的列表,那么python3的这些改变将会使你的代码卡住,因为视图不支持索引。

python2

python3

备注

a_dictionary.keys()

list(a_dictionary.keys())

使用list()将keys返回值转换为一个静态列表

a_dictionary.items()

list(a_dictonary.items())

将items返回值转为列表

a_dictionary.iterkeys()

iter(a_dictionary.keys())

python3不再支持iterkeys,使用iter()将keys()的返回值转换为一个迭代器

[iforiina_dictionary.iterkeys()]

[iforiina_dictonary.keys()]

不需要使用额外的iter(),keys()方法返回的是可迭代的

min(a_dictionary.keys())

nochange

对min(),max(),sum(),list(),tuple(),set(),sorted(),any()和all()同样有效

重命名或重新组织的模块

从python2到python3,标准库里的一些模块已经被重命名。

还有一些相互关联的模块也被组合或则重新组织,使得这种关联更有逻辑性。

HTTP

python3中几个相关的http模块被组合成一个单独的包,即http

python2

python3

备注

importhttplib

importhttp.client

http.client模块实现一个底层的库,可以用来请求和解析http

importcookie

importhttp.cookies

http.cookie提供一个pythonic接口进行cookies操作

importcookielib

importhttp.cookiejar

http.cookiejar可以操作cookies文件

importBaseHTTPServerimportSimpleHTTPServerimportCGIHttpServer

importhttp.server

http.server实现了一个基本的http服务器

URLLIB

python2中用来分析、编码和获取URL的模块,但是比较混乱,python3中,这些模块被重构,组合成为一个单独的包,即urllib

|python2|python3|备注|importurllib|importurllib.request,importurllb.parse,importurllib.error||importurllib2|importurllib.request,urllib.error||importurlparse|importurllib.parse||importrobotparser|importurllib.robotparser||fromurllibimportFancyURLopener|fromurllib.rquestimportFancyURLopenerfromurllib.parse||fromurllib2importRequestfromurllib2importHTTPError|fromurllib.requestimportRequestfromurllib.errorimportHTTPError|

DBM

所有的DBM现在都在一个单独的包里,即dbm。

如果需要其中某个特定的变体,比如GNUDBM,可以导入dbm包中合适的模块。

python2

python3

备注

importdbm

importdbm.ndbm

importgdbm

importdbm.gnu

importdbhash

importdbm.bad

importdumbdbm

importdbm.dumb

importanydbmimportwhichdb

importdbm

XMLRPC

XML-RPC是一个通过HTTP协议执行远程RPC调用的轻重级方法。

一些XML_RPC客户端和XML_RPC服务端的实现库组合成独立的包,xmlrpc.

python2

python3

备注

importxmlrpclib

importxmlrpc.client

importDocXMLRPCServerimportSimpleXMLRPCServer

importxmlrpc.server

其他模块

Python2

python3

备注

try:

importcStringIOasStringIOexceptImportError:

importSTringIO

importio

try:

importcPickleaspickleexceptImportError:

importpickle

importpickle

import?

builtin

importbuiltins

importcopy_reg

importcopyreg

importQueue

importqueue

importSocketServer

importsocketserver

importConfigParser

importconfigparser

importrepr

importreprlib

importcommands

importsubprocess

包内的相对导入

包是由一组相关联的模块共同组成的单个实体。

在python2的时候,为了实现同一个包内模块的相互引用,你会使用importfoo或者fromfooimportBar。

Python2解释器会先在当前目录里搜索foo.py,然后再去python搜索路径(sys.path)搜索。

在python3里这个过程有一点不同。

Python3不会首先在当前路径搜索,它会直接在Python的搜索路径里寻找。

如果想要包里的一个模块导入包的另一个模块,需要显式的提供两个模块的相对路径。

迭代器方法NEXT()

python2里,迭代器有一个next()方法,用来返回序列的下一项。

在python3里同样成立。

但是有一个新的全局的函数next(),它使用一个迭代器作为参数。

python2

python3

备注

anIterator.next()

next(anIterator)

a_function_that_returns_an_iterator().next()

next(a_function_that_returns_an_iterator())

classA:

defnext(self):

pass

classA:

def?

next(self):

pass

classA:

defnext(self,x,y):

pass

nochange

next=42foran_iteratorina_sequence_of_iterators:

an_iterator.next()

next=42foraninteratorina_sequence_of_iterators:

an_iterator.next()

全局函数FILTER()

在python2里,filter()方法返回一个列表,这个列表是通过一个返回值为True或False的函数来检测序列里的每一项的道德。

在python3中,filter()函数返回一个迭代器,不再是列表。

python2

python3

备注

filter(a_function,a_sequence)

list(filter(a_function,a_sequence))

list(filter(a_function,a_sequence))

nochange

filter(None,a_sequence)

[iforiina_sequenceifi]

foriinfilter(None,a_sequence):

nochange

[iforiinfilter(a_function,a_sequence)]

nochange

MAP()

跟filter()的改变一样,map()函数现在返回一个迭代器,python2中返回一个列表。

python2

python3

备注

map(a_function,'PapayaWhip'

list(map(a_function,'PapayaWhip'))

map(None,'PapayaWhip'

list('PapayWhip')

map(lambdax:

x+1,range(42))

[x+1forxinrange(42)]

foriinmap(a_function,a_sequence):

nochange

[iforiinmap(a_function,a_sequence)]

nochange

REDUCE()

在python3里,reduce()函数已经从全局名字空间移除,现在被放置在fucntools模块里。

python2

python3

备注

reduce(a,b,c)

fromfunctoolsimportreducereduce(a,b,c)

APPLY()

python2有一个叫做apply()的全局函数,它使用一个函数f和一个列表[a,b,c]作为参数,返回值是f(a,b,c).可以直接调用这个函数,在列表前添加一个星号作为参数传递给它来完成同样的事情。

在python3里,apply()函数不再存在;必须使用星号标记。

python2

python3

备注

apply(a_function,a_list_of_args

a_function(*a_list_of_args)

apply(a_function,a_list_of_args,a_dictionary_of_named_args)

a_function(*a_list_of_args,**a_dictionary_of_named_args)

apply(a_function,a_list_of_args+z)

a_function(*a_list_of_args+z)

apply(aModule.a_function,a_list_of_args)

aModule.a_function(*a_list_of_args)

INTERN()?

 python2里,你可以用intern()函数作用在一个字符串上来限定intern以达到性能优化,python3里,intern()函数转移到sys模块里。

python2

python3

备注

intern(aString)

sys.intern(aString)

--------

EXEC

就像print语句在python3里变成了一个函数一样,exec语句也是这样的。

exec()函数使用一个包含任意python代码的字符串作为参数,然后像执行语句或表达式一样执行它。

exec()跟eval()是相似,但exec()更加强大并具有挑战性。

eval()函数只能执行单独一条表达式,但是exec()能够执行多条语句,导入(import),函数声明-实际上整个python程序的字符串表示也可以。

python2

python3

备注

execcodeString

exec(codeString)

execcodeStringina_global_namespace

exec(codeString,a_global_namespace)

exec_codeStringina_global_namespace,a_local_namespace

exec(codeString,a_global_namespace,a_local_namespace

execfile

python2中的execfile语句可以像执行python代码那样使用字符串。

不同的是exec使用字符串,而execfile使用文件。

在python3,execfile语句被去掉了。

REPR

在python2,为了得到一个任意对象的字符串表示,有一种把对象包装在反引号里(比如x)的特殊语法。

在python3里,这种能力仍然存在,但是你不能再使用反引号获得这种字符串表示了,需要使用全局函数repr().

python2

python3

备注

x

repr(x)

'PapayaWhip'+2

repr('PapayWhip'+repr

(2))

TRYEXCEPT语句

python2到python3,捕获异常的语法有些变化。

Python2

Python3

备注

try:

importmymoduleexceptImportError,epass

try:

importmymoduleexceptImportErrorase:

pass

try:

importmymoduleexcept(RuntimeError,ImportError),epass

try:

importmymoduleexcept(RuntimeError,ImportError)ase:

pass

try:

importmymoduleexceptImportError:

pass

nochange

try:

importmymoduleexcept:

pass

nochange

RAISE

python3里,抛出自定义异常的语法有细微的变化。

python2

python3

备注

raiseMyException

unchanged

raiseMyException,'errormessage'

raiseMyException('errormessage')

raiseMyException,'errormessage'

raiseMyException('errormessage').with_traceback(a_traceback)

raise'errormessage'

unsupported

生成器THROW

在python2里,生成器有一个throw()方法。

调用a_generator.throw()会在生成器被暂停的时候抛出异常,然后返回由生成器函数获取的下一个值。

python3中,这一功能仍然可用,但语法有一点不同。

python2

python3

备注

a_generator.throw(MyException)

nochange

a_generator.throw(MyException,'errormessage'

a_generator.throw(MyException('errormessage'))

a_generator.throw('errormessage')

unsupported

XRANGE()

python2里,有两种方法获得一定范围内的数字:

range(),返回一个列表,还有xrange(),返回一个迭代器。

python3 里,range()返回迭代器,xrange()不再存在。

python2

python3

备注

xrange(10)

range(10)

a_list=range(10)

a_list=list(range(10))

[iforiinxrange(10)]

[iforiinrange(10)]

foriinrange(10):

nochange

sum(range(10))

nochange

RAW_INPUT()和INPUT()

python2有两个全局函数,用在命令行请求用户输入。

第一个叫input(),它等待用户输入一个python表达式(然后返回结果)。

第二个叫做raw_input(),用户输入什么他就返回什么。

python3通过input替代了他们。

python2

python3

备注

raw_input()

input

input替代了raw_input

raw_input('prompt')

input('prompt')

python3仍然支持提示符参数

input()

eval(input))

函数属性FUNC_*

python2,函数的代码可用访问到函数本身的特殊属性。

python3为了一致性,这些特殊属性被重命名了。

python2

python3

备注

a_function.func_name

a_function.__name__

__name__属性包含了函数的名字

a_function.func_doc

a_function.__doc__

__doc__包含了函数源代码定义的文档字符串

a_function.func_defaults

a_function.__defaults__

是一个保存参数默认值的元组

a_function.func_dict

a_function.__dict__

__dict__属性是一个支持任意函数属性的名字空间

a_function.func_closure

a_function.__closure__

__closure__属性是由cell对象组成的元组,包含了函数对自由变量的绑定

a_function.func_globals

a_function.__globals__

是对模块全局名字空间的引用

a_function.func_code

a_function.__code__

是一个代码对象,表示编译后的函数体

I/O方法XREADLINES()

python2中,文件对象有一个xreadlines()方法,返回一个迭代器,一次读取文件的一行。

这在for循环中尤其实用。

python3中,xreadlines()方法不再可用。

lambda函数

在python2中,可以定义匿名函数lambda函数,通过指定作为参数的元组的元素个数,使这个函数实际上能够接收多个参数。

python2的解释器把这个元组"解开“成命名参数,然后可以在lambda函数里引用它们。

在python3中仍然可以传递一个元组为lambda函数的参数。

但是python解释器不会把它当成解析成命名参数。

需要通过位置索引来引用每个参数。

python2

python3

备注

lambda(x,):

x+f(x)

lambdax1:

x1[0]+f(x1[0])

注1

lambda(x,y

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2