python2 与python3的区别
几乎所有的python2程序都需要一些修改才能正常的运行在python3的环境下。为了简化这个转换过程,Python3自带了一个2to3的实用脚本.这个脚本会将python2程序源文件作为输入,然后自动转换到python3.但并不是所有内容都可以自动转换。
print语句
python2中print是一个语句,不论想输出什么,直接放到print关键字后面即可。python3里,print()是一个函数,像其他函数一样,print()需要你将要输出的东西作为参数传给它。
python2 python3 备注
print print() 输出一个空白行,python3需要调用不带参数的print()
print 1 print(1) 输出一个值,将值传入print()函数
print 1, 2 print(1,2) 输出使用空格分割的两个值,使用两个参数调用print()
print 1, 2, print(1,2, end=' ') python2中如果使用一个,作为print结尾,将会用空格分割输出的结果,然后在输出一个尾随的空格,而
不输回车。python3里,把end=' ' 作为一个关键字传给print()可以实现同样的效果,end默认值为'\n',
所以通过重新指定end参数的值,可以取消在末尾输出回车符号
print >> print(1, 2, 3, python2中,可以通过>>pipe_name语法,把输出重定向到一个管道,比如sys.stderr.在python3里,
UNICODE字符串
python2中有两种字符串类型:Unicode字符串和非Unicode字符串。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只支持!=, 不再支持<>
字典类方法HAS_KEY()
Python2中,字典对象has_key()方法测试字典是否包含指定的键。python3不再支持这个方法,需要使用in.
返回列表的字典类方法
在python2里,许多字典类方法的返回值是列表。最常用方法有keys, items和values。python3,所有以上方法的返回值改为动态试图。在一些上下文环境里,这种改变不会产生影响。如果这些方法的返回值被立即传递给另外一个函数,而且那个函数会遍历整个序列,那么以上方法的返回值是列表或视图并不会产生什么不同。如果你期望获得一个被独立寻址元素的列表,那么python3的这些改变将会使你的代码卡住,因为视图不支持索引。
重命名或重新组织的模块
从python2到python3,标准库里的一些模块已经被重命名。还有一些相互关联的模块也被组合或则重新组织,使得这种关联更有逻辑性。
HTTP
python3中几个相关的http模块被组合成一个单独的包,即http
python2 python3 备注
anIterator.next() 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:
RAW_INPUT()和INPUT()
python2有两个全局函数,用在命令行请求用户输入。第一个叫input(),它等待用户输入一个python表达式(然后返回结果)。第二个叫做raw_input(),用户输入什么他就返回什么。python3 通过input替代了他们。
函数属性FUNC_*
python2,函数的代码可用访问到函数本身的特殊属性。python3为了一致性,这些特殊属性被重命名了。
I/O方法XREADLINES()
python2中,文件对象有一个xreadlines()方法,返回一个迭代器,一次读取文件的一行。这在for循环中尤其实用。python3中,xreadlines()方法不再可用。
lambda函数
在python2中,可以定义匿名函数lambda函数,通过指定作为参数的元组的元素个数,使这个函数实际上能够接收多个参数。python2的解释器把这个元组"解开“成命名参数,然后可以在lambda函数里引用它们。在python3中仍然可以传递一个元组为lambda函数的参数。但是python解释器不会把它当成解析成命名参数。需要通过位置索引来引用每个参数。
__NONZERO__特殊方法
在python2里,可以创建自己的类,并使他们能够在布尔上下文中使用。举例来说,可以实例化这个类,并把这个实例对象用在一个if语句中。为了实现这个目的,可以定义一个特别的__nonzero__()方法,它的返回值为True或False,当实例对象处在布尔上下文中的时候这个方法就会被调用。在python3中,仍然可以完成同样的功能,但这个特殊方法的名字改为了__bool__()
比如python2中
class A:
def__nonzero__(self):
pass
python3中改为:class A: def bool(self):pass
在布尔上下文使用一个类对象时,python3会调用__bool__().
python2中:
class A:
def__nonzero__(self, x, y):
pass
这种情况python3中不做改变,使用两个参数的__nonzero__()方法,2to3脚本会假设你定义的这个方法有其他用处,不做修改。
八进制类型
python2和python3,定义八进制数的语法有轻微的改变
SYS.MAXINT
python3中长整型和整型被整合到一起,sys.maxint常量不再精确。但是因为这个值用于检查特定平台,所以被python3保留,重命名为sys.maxsize. 全局函数CALLABLE()
python2里,可以使用全局函数callable()来检查一个对象是否可调用,在python3中,这个全局函数被取消了,为了检查一个对象是否可调用,可以检查其特殊方法__call__()的存在性。
全局函数ZIP()
在python2,zip()可以使用任意多个序列作为参数,它返回一个由元组构成的列表。第一个元组包含了每个序列的第一个元素,第二个元组包含了每个序列的第二个元素,依次递推。在python3中返回一个迭代器,而非列表。
STANDARDERROR异常
python2中,StandardError是除了StopIteration,GeneratorExit,KeyboardInterrupt, SystemExit之外所有其他内置异常的基类。python3中StandardError 已经被取消了,使用Exception取代。
TYPES模块中的常量
types模块里各种各样的常量能够帮助你决定一个对象的类型。在python2里,它包含了代表所有基本数据类型的常量,如dict和int。在python3里,这些常量被取消了,只需使用基础类型的名字来替代。
全局函数ISINSTANCE()
isinstance()函数检查一个对象是否是一个特定类(class)或类型(type)的实例。在python2,可以传递一个由类型构成的元组给isinstance(),如果该对象是元组里的任意一种类型,函数返回True. 在python3,依然可以这样做。
ITERTOOLS模块
python2.3引入itertools模块,定义了zip(),map(),filter()的变体,这个变体返回的是迭代器,而非列表。在python3,这些函数返回的本身就是迭代器,所有这些变体函数就取消了。
SYS.EXC_TYPE,SYS.EXC_VALUE,SYS.EXC_TRACEBACK
处理异常的时候,在sys模块里有三个你可以访问的变量:sys.exc_type, sys.exc_value, sys.exc_traceback. python3中这三个变量不再存在,使用sys.exc_info替代。
对元组的列表解析
python2,如果需要编写一个遍历元组的列表解析,不需要在元组值周围加上括号。在python3里,这些括号是必需的。