python2与python3的区别
⼏乎所有的python2程序都需要⼀些修改才能正常的运⾏在python3的环境下。为了简化这个转换过程,Python3⾃带了⼀个2to3的实⽤脚本.这个脚本会将python2程序源⽂件作为输⼊,然后⾃动转换到python3.但并不是所有内容都可以⾃动转换。
print语句
python2中print是⼀个语句,不论想输出什么,直接放到print关键字后⾯即可。python3⾥,print()是⼀个函数,像其他函数⼀样,print()需要你将要输出的东西作为参数传给它。
python2python3备注
print print()输出⼀个空⽩⾏,python3需要调⽤不带参数的print()
print 1print(1)输出⼀个值,将值传⼊print()函数
print 1, 2print(1,2)输出使⽤空格分割的两个值,使⽤两个参数调⽤print()
print 1, 2,print(1,2,
黑马最新java视频end=' ')python2中如果使⽤⼀个,作为print结尾,将会⽤空格分割输出的结果,然后在输出⼀个尾随的空格,⽽不输回车。python3⾥,把end=' ' 作为⼀个关键字传给print()可以实现同样的效果,end默认值为'\n',所以通过重新指定end参数的值,可以取消在末尾输出回车符号
print >> sys.stderr, 1, 2, 3print(1, 2, 3,
file=sys.stderr
python2中,可以通过>>pipe_name语法,把输出重定向到⼀个管道,⽐如sys.stderr.在python3⾥,可以通过将
管道作为关键字参数file的值传递给print()完成同样的功能。
UNICODE字符串
python2中有两种字符串类型:Unicode字符串和⾮Unicode字符串。Python3中只有⼀种类型:Unicode字符串。
python2python3备注
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中的长整型类似。
python2python3备注
x = 1000000000000L x = 1000000000000python2中的⼗进制长整型在python3中被替换为⼗进制普通整数
x = 0xFFFFFFFFFFFFL x = 0xFFFFFFFFFFFF python2⾥的⼗六进制长整型在python3⾥被替换为⼗六进制的普通整数
long(x)int(x)python3没有long()
type(x) is long type(x) is int python3⽤int判断是否为整型
isinstance(x, long)isinstance(x, int)int检查整数类型
<>⽐较运算符
Python2⽀持<>作为!=的同义词, python3只⽀持!=, 不再⽀持<>
字典类⽅法HAS_KEY()
Python2中,字典对象has_key()⽅法测试字典是否包含指定的键。python3不再⽀持这个⽅法,需要使⽤in.
返回列表的字典类⽅法
在python2⾥,许多字典类⽅法的返回值是列表。最常⽤⽅法有keys, items和values。python3,所有
以上⽅法的返回值改为动态试图。在⼀些上下⽂环境⾥,这种改变不会产⽣影响。如果这些⽅法的返回值被⽴即传递给另外⼀个函数,⽽且那个函数会遍历整个序列,那么以上⽅法的返回值是列表或视图并不会产⽣什么不同。如果你期望获得⼀个被独⽴寻址元素的列表,那么python3的这些改变将会使你的代码卡住,因为视图不⽀持索引。
python2python3备注
a_dictionary.keys()list(a_dictionary.keys())使⽤list()将keys 返回值转换为⼀个静态列表
a_dictionary.items()list(a_dictonary.items())将items返回值转为列表
python2python3备注
a_dictionary.iterkeys()iter(a_dictionary.keys())python3不再⽀持iterkeys,使⽤iter()将keys()的返回值转换为⼀个迭代器
[i for i in a_dictionary.iterkeys()][ i for i in a_dictonary.keys()]不需要使⽤额外的iter(),keys()⽅法返回的是可迭代的
min(a_dictionary.keys())no change对min(),max(),sum(),list(),tuple(),set(),sorted(),any()和all()同样有效
重命名或重新组织的模块
从python2到python3,标准库⾥的⼀些模块已经被重命名。还有⼀些相互关联的模块也被组合或则重新组织,使得这种关联更有逻辑性。
HTTP
python3中⼏个相关的http模块被组合成⼀个单独的包,即http
python2python3备注
import httplib import http.client http.client模块实现⼀个底层的库,可以⽤来请求和
解析http
import cookie import
import cookielib import
import http.server http.server实现了⼀个基本的http服务器
import BaseHTTPServer import SimpleHTTPServer import
CGIHttpServer
URLLIB
python2中⽤来分析、编码和获取URL的模块,但是⽐较混乱,python3中,这些模块被重构,组合成为⼀个单独的包,即urllib
| python2 | python3 | 备注 | import urllib | quest, import urllb.parse, | | import urllib2 | quest, | | import urlparse | import urllib.parse | | import robotparser | botparser | | from urllib import FancyURLopener | from urllib.rquest import FancyURLopener from urllib.parse | |from urllib2 import Request from urllib2 import HTTPError | quest import Request import HTTPError |
DBM
所有的DBM现在都在⼀个单独的包⾥,即dbm。如果需要其中某个特定的变体,⽐如GNU DBM,可以导⼊dbm包中合适的模块。
python2python3备注
import dbm import dbm.ndbm
import gdbm u
import dbhash import dbm.badvariable words举例
import dumbdbm import dbm.dumb
import anydbm import whichdb import dbm
XMLRPC
XML-RPC是⼀个通过HTTP协议执⾏远程RPC调⽤的轻重级⽅法。⼀些XML_RPC客户端和XML_RPC服务端的实现库组合成独⽴的包,xmlrpc.
python2python3备注
import xmlrpclib import xmlrpc.client
import DocXMLRPCServer import SimpleXMLRPCServer import xmlrpc.server
其他模块
Python2python3备注
try: import cStringIO as StringIO except ImportError: import STringIO import io
try: import cPickle as pickle except ImportError: import pickle import pickle
import builtin import builtins
import copy_reg import copyreg
import Queue import queue
import SocketServer import socketserver
python在线编辑器python3import ConfigParser import configparser
import repr import reprlib
import commands import subprocess
Python2python3备注
包内的相对导⼊
包是由⼀组相关联的模块共同组成的单个实体。在python2的时候,为了实现同⼀个包内模块的相互引⽤,你会使⽤import foo或者from foo import Bar。Python2解释器会先在当前⽬录⾥搜索foo.py,然后再去python搜索路径(sys.path)搜索。在python3⾥这个过程有⼀点不同。Python3不会⾸先在当前路径搜索,它会直接在Python的搜索路径⾥寻。如果想要包⾥的⼀个模块导⼊包的另⼀个模块,需要显式的提供两个模块的相对路径。
迭代器⽅法NEXT()
python2⾥,迭代器有⼀个next()⽅法,⽤来返回序列的下⼀项。在python3⾥同样成⽴。但是有⼀个新的全局的函数next(),它使⽤⼀个迭代器作为参数。
python2python3备注
<()next(anIterator)
a_function_that_returns_an_iterator().next()next(a_function_that_returns_an_iterator()) class A: def next(self): pass class A : def next(self): pass
class A: def next(self, x, y): pass no change
next = 42 for an_iterator in a_sequence_of_iterators: ()next =42 for an interator in a_sequence_of_iterators: ()
全局函数FILTER()
在python2⾥,filter()⽅法返回⼀个列表,这个列表是通过⼀个返回值为True或False的函数来检测序列⾥的每⼀项的道德。在python3中,filter()函数返回⼀个迭代器,不再是列表。
python2python3备注
filter(a_function, a_sequence)list(filter(a_function, a_sequence))
list(filter(a_function, a_sequence))no change
filter(None, a_sequence)[i for i in a_sequence if i ]
for i in filter(None, a_sequence):no change
[i for i in filter(a_function, a_sequence)]no change
MAP()
跟filter()的改变⼀样,map()函数现在返回⼀个迭代器,python2中返回⼀个列表。
python2python3备注
map(a_function,'PapayaWhip'list(map(a_function, 'PapayaWhip'))
map(None, 'PapayaWhip'list('PapayWhip')
map(lambda x: x+1, range(42))[x+1 for x in range(42)]
for i in map(a_function, a_sequence):no change
[i for i in map(a_function, a_sequence)]no change
REDUCE()
在python3⾥,reduce()函数已经从全局名字空间移除,现在被放置在fucntools模块⾥。
python2python3备注
reduce(a,b,c)from functools import reduce reduce(a, b, c)
最全三角函数值对照表APPLY()
python2有⼀个叫做apply()的全局函数,它使⽤⼀个函数f和⼀个列表[a,b,c]作为参数,返回值是f(a,b,c).可以直接调⽤这个函数,在列表前添加⼀个星号作为参数传递给它来完成同样的事情。在python3⾥,apply()函数不再存在;必须使⽤星号标记。
python2python3备注
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_dictio
nary_of_named_args)
电脑显示error
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)
python2python3备注
INTERN()  python2⾥,你可以⽤intern()函数作⽤在⼀个字符串上来限定intern以达到性能优化,python3⾥,intern()函数转移到sys模块⾥。
python2python3备注
intern(aString)sys.intern(aString)--------
EXEC
就像print语句在python3⾥变成了⼀个函数⼀样,exec语句也是这样的。exec()函数使⽤⼀个包含任意python代码的字符串作为参数,然后像执⾏语句或表达式⼀样执⾏它。exec()跟eval()是相似,但exec()更加强⼤并具有挑战性。eval()函数只能执⾏单独⼀条表达式,但是exec()能够执⾏多条语句,导⼊(import),函数声明-实际上整个python程序的字符串表⽰也可以。
python2python3备注
exec codeString exec(codeString)
exec codeString in a_global_namespace exec(codeString, a_global_namespace)
exec_codeString in a_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().
python2python3备注
x repr(x)
'PapayaWhip' +2repr('PapayWhip' + repr(2))
TRYEXCEPT语句
python2到python3,捕获异常的语法有些变化。
Python2Python3备注
try: import mymodule except ImportError, e pass try: import mymodule except ImportError as e: pass
try: import mymodule except (RuntimeError, ImportError), e pass try: import mymodule except(RuntimeError, ImportError) as e: pass
try: import mymodule except ImportError: pass no change
try: import mymodule except: pass no change
RAISE
python3⾥,抛出⾃定义异常的语法有细微的变化。
python2python3备注
raise MyException unchanged
raise MyException, 'error message'raise MyException('error message')
raise MyException, 'error message'raise MyException('error message').with_traceback(a_traceback)
raise 'error message'unsupported
⽣成器THROW
在python2⾥,⽣成器有⼀个throw()⽅法。调⽤a_generator.throw()会在⽣成器被暂停的时候抛出异常,然后返回由⽣成器函数获取的下⼀个值。python3中,这⼀功能仍然可⽤,但语法有⼀点不同。
python2python3备注
a_generator.throw(MyException)no change
python2python3备注
a_generator.throw(MyException, 'error message'a_generator.throw(MyException('error message'))
a_generator.throw('error message')unsupported
XRANGE()
python2⾥,有两种⽅法获得⼀定范围内的数字:range(),返回⼀个列表,还有xrange(),返回⼀个迭代器。python3 ⾥,range()返回迭代器,xrange()不再存在。
python2python3备注
xrange(10)range(10)儿童编程入门书籍
a_list = range(10)a_list= list(range(10))
[i for i in xrange(10)][i for i in range(10)]
for i in range(10):no change
sum(range(10))no change
RAW_INPUT()和INPUT()
python2有两个全局函数,⽤在命令⾏请求⽤户输⼊。第⼀个叫input(),它等待⽤户输⼊⼀个python表达式(然后返回结果)。第⼆个叫做raw_input(),⽤户输⼊什么他就返回什么。python3 通过input替代了
他们。
python2python3备注
raw_input()input input替代了raw_input
raw_input('prompt')input('prompt')python3仍然⽀持提⽰符参数
input()eval(input))
函数属性FUNC_*
python2,函数的代码可⽤访问到函数本⾝的特殊属性。python3为了⼀致性,这些特殊属性被重命名了。
python2python3备注
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解释器不会把它当成解析成命名参数。需要通过位置索引来引⽤每个参数。
python2python3备注
lambda (x,): x + f(x)lambda x1 : x1[0] + f(x1[0])注1
lambda (x,y): x + f(y)lambda x_y : x_y[0] + f(x_y[1])注2
lambda (x,(y,z)): x + y + z lambda x_y_z: x_y_z[0] + x_y_z[1][0]+ x_y_z[1][1]注3
lambda x,y,z: x+y+z unchanged注4
注1:如果定义了⼀个lambda函数,使⽤包含⼀个元素的元组作为参数,python3中,会被转换成⼀个包含到x1[0]的引⽤的lambda函数。x1是2to3脚本基于原

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。