python2 与 python3的区别文档格式.docx

上传人:b****8 文档编号:21970088 上传时间:2023-02-02 格式:DOCX 页数:17 大小:23.45KB
下载 相关 举报
python2 与 python3的区别文档格式.docx_第1页
第1页 / 共17页
python2 与 python3的区别文档格式.docx_第2页
第2页 / 共17页
python2 与 python3的区别文档格式.docx_第3页
第3页 / 共17页
python2 与 python3的区别文档格式.docx_第4页
第4页 / 共17页
python2 与 python3的区别文档格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

python2 与 python3的区别文档格式.docx

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

python2 与 python3的区别文档格式.docx

Unicode字符串和非Unicode字符串。

Python3中只有一种类型:

Unicode字符串。

u'

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类型最大值不能超过,而且这个最大值是平台相关的。

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

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

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的这些改变将会使你的代码卡住,因为视图不支持索引。

()

list())

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

将items返回值转为列表

iter())

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

[()]

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

min())

nochange

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

重命名或重新组织的模块

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

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

HTTP

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

importhttplib

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

importcookie

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

importcookielib

可以操作cookies文件

importBaseHTTPServerimportSimpleHTTPServerimportCGIHttpServer

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

URLLIB

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

|python2|python3|备注|importurllib|,,||importurllib2|,||importurlparse|||importrobotparser|||fromurllibimportFancyURLopener|所有的DBM现在都在一个单独的包里,即dbm。

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

importdbm

importgdbm

importdbhash

importdumbdbm

importanydbmimportwhichdb

XMLRPC

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

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

importxmlrpclib

importDocXMLRPCServerimportSimpleXMLRPCServer

其他模块

Python2

try:

importcStringIOasStringIOexceptImportError:

importSTringIO

importio

importcPickleaspickleexceptImportError:

importpickle

importbuiltin

importbuiltins

importcopy_reg

importcopyreg

importQueue

importqueue

importSocketServer

importsocketserver

importConfigParser

importconfigparser

importrepr

importreprlib

importcommands

importsubprocess

包内的相对导入

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

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

Python2解释器会先在当前目录里搜索,然后再去python搜索路径搜索。

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

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

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

迭代器方法NEXT()

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

在python3里同样成立。

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

next(anIterator)

a_function_that_returns_an_iterator().next()

next(a_function_that_returns_an_iterator())

classA:

defnext(self):

pass

defnext(self,x,y):

next=42foran_iteratorina_sequence_of_iterators:

next=42foraninteratorina_sequence_of_iterators:

全局函数FILTER()

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

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

filter(a_function,a_sequence)

list(filter(a_function,a_sequence))

filter(None,a_sequence)

[iforiina_sequenceifi]

foriinfilter(None,a_sequence):

[iforiinfilter(a_function,a_sequence)]

MAP()

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

map(a_function,'

list(map(a_function,'

))

map(None,'

list('

PapayWhip'

map(lambdax:

x+1,range(42))

[x+1forxinrange(42)]

foriinmap(a_function,a_sequence):

[iforiinmap(a_function,a_sequence)]

REDUCE()

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

reduce(a,b,c)

fromfunctoolsimportreducereduce(a,b,c)

APPLY()

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

在python3里,apply()函数不再存在;

必须使用星号标记。

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,a_list_of_args)

(*a_list_of_args)

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

intern(aString)

(aString)

--------

EXEC

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

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

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

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

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().

x

repr(x)

+2

repr('

+repr

(2))

TRYEXCEPT语句

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

Python3

importmymoduleexceptImportError,epass

importmymoduleexceptImportErrorase:

importmymoduleexcept(RuntimeError,ImportError),epass

importmymoduleexcept(RuntimeError,ImportError)ase:

importmymoduleexceptImportError:

importmymoduleexcept:

RAISE

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

raiseMyException

unchanged

raiseMyException,'

errormessage'

raiseMyException('

).with_traceback(a_traceback)

raise'

unsupported

生成器THROW

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

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

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

(MyException)

(MyException,'

(MyException('

('

XRANGE()

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

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

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

xrange(10)

range(10)

a_list=range(10)

a_list=list(range(10))

[iforiinxrange(10)]

[iforiinrange(10)]

foriinrange(10):

sum(range(10))

RAW_INPUT()和INPUT()

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

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

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

python3通过input替代了他们。

raw_input()

input

input替代了raw_input

raw_input('

prompt'

input('

python3仍然支持提示符参数

input()

eval(input))

函数属性FUNC_*

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

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

__name__属性包含了函数的名字

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

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

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

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

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

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

I/O方法XREADLINES()

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

这在for循环中尤其实用。

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

lambda函数

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

python2的解释器把这个元组"

解开“成命名参数,然后可以在lambda函数里引用它们。

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

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

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

lambda(x,):

x+f(x)

lambdax1:

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

注1

lambda(x,y):

x+f(y)

lambdax_y:

x_y[0]+f(x_y[1])

注2

lambda(x,(y,z)):

x+y+z

lambdax_y_z:

x_y_z[0]+x_y_z[1][0]+x_y_z[1][1]

注3

lambdax,y,z:

注4

注1:

如果定义了一个lambda函数,使用包含一个元素的元组作为参数,python3中,会被转换成一个包含到x1[0]的引用的lambda函数。

x1是2to3脚本基于原来元组里的命名参数自动生成的。

注2:

使用含有两个元素的元组(x,y)作为参数的lambda函数被转换为x_y,它有两个位置参数,即x_y[0]和x_y[1]

注3:

2to3脚本可以处理使用嵌套命名参数的元组作为参数的lambda函数。

产生的结果有点晦涩,但python3下和python2的效果是一样的。

注4:

可以定义使用多个参数的lambda函数。

语法在python3同样有效

特殊的方法属性

在python2里,类方法可以访问到定义他们的类对象,也能访问方法对象本身。

im_self是类的实例对象;

im_func是函数对象,im_class是类本身。

在python3里,这些属性被重命名,以遵循其他属性的命名约定。

特殊方法

在python2里,可以创建自己的类,并使他们能够在布尔上下文中使用。

举例来说,可以实例化这个类,并把这个实例对象用在一个if语句中。

为了实现这个目的,可以定义一个特别的__nonzero__()方法,它的返回值为True或False,当实例对象处在布尔上下文中的时候这个方法就会被调用。

在python3中,仍然可以完成同样的功能,但这个特殊方法的名字改为了__bool__()

比如python2中

def__nonzero__(self):

python3中改为:

 classA:

defbool(self):

在布尔上下文使用一个类对象时,python3会调用__bool__().

python2中:

def__nonzero__(self,x,y):

这种情况python3中不做改变,使用两个参数的__nonzero__()方法,2to3脚本会假设你定义的这个方法有其他用处,不做修改。

八进制类型

python2和python3,定义八进制数的语法有轻微的改变

x=0755

x=0o755

python3中长整型和整型被整合到一起,常量不再精确。

但是因为这个值用于检查特定平台,所以被python3保留,重命名为.

全局函数CALLABLE()

python2里,可以使用全局函数callable()

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

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1