Python 3有何新变化
future模块
Python 3.x介绍了一些与Python 2不兼容的关键字和特性,可以通过Python 2中内置的future模块导入。如果您计划为您的代码提供Python 3.x支持,建议使用future导入。
例如,如果我们希望在Python 2中使用Python 3.x的整数除法行为,请添加以下导入语句。
from __future__ import division
打印函数
Python 3中最显着且最广为人知的变化是如何使用打印函数。现在必须使用带括号()的打印函数。 在Python 2中是可选的。
print "Hello World" #Python 2中可以接受
print ("Hello World") # 在Python 3中,print后面必须跟括号()
print()函数默认情况下会在最后插入一个换行符。在Python 2中,可以通过在末尾添加’,’来抑制它。在Python 3中,”end =’ ‘”将空格附加到换行符。
print x, # 后置逗号抑制Python 2的换行符
print(x, end=" ") # 在Python 3中附加一个空格而不是换行符
从键盘读取输入
Python 2有两个版本的输入函数,input()和raw_input()。 如果包含在引号”或””中,则input()函数将接收到的数据视为字符串,否则数据将视为数字。
在Python 3中,raw_input()函数被取消。此外,接收到的数据始终被视为字符串。
在Python 2中
>>> x = input('something:')
something:10 #输入的数据被视为数字
>>> x
10
>>> x = input('something:')
something:'10' #输入的数据被视为字符串
>>> x
'10'
>>> x = raw_input("something:")
something:10 #即使没有'',输入的数据也被视为字符串
>>> x
'10'
>>> x = raw_input("something:")
something:'10' #包括''输入的数据被视为字符串
>>> x
"'10'"
在Python 3中
>>> x = input("something:")
something:10
>>> x
'10'
>>> x = input("something:")
something:'10' #包括''和没有''输入的数据都被视为字符串
>>> x
"'10'"
>>> x = raw_input("something:") #将引发NameError错误
Traceback (most recent call last):
File "<pyshell#3>", line 1, in
<module>
x = raw_input("something:")
NameError: name 'raw_input' is not defined
整数除法
在Python 2中,两个整数的除法结果会四舍五入到最近的整数。因此,3/2将显示1。要获得浮点除法,必须显式将分子或分母用作浮点数。因此,3.0/2或3/2.0或3.0/2.0将会得到1.5。
Python 3将3/2默认评估为1.5,这对新程序员来说更直观。
Unicode表示
Python 2要想将字符串存储为Unicode,需要使用u标记。
Python 3默认将字符串存储为Unicode。我们有Unicode(utf-8)字符串和2个字节类别:字节和字节数组。
xrange()函数已经移除
在Python 2中,range()返回一个列表,而xrange()返回一个仅在需要时生成范围内项目的对象,节省了内存。
在Python 3中,移除了range()函数,并且xrange()已重命名为range()。此外,range()对象支持Python 3.2及更高版本的切片。
raise异常
Python 2接受旧的和新的语法;如果不将异常参数括在括号中,Python 3会引发SyntaxError。
raise IOError, "file error" #在Python 2被接受
raise IOError("file error") #在Python 2也被接受
raise IOError, "file error" #在Python 3引发语法错误
raise IOError("file error") #在Python 3建议使用的语法
异常中的参数
在Python 3中,应使用’as’关键字声明异常的参数。
except Myerror, err: #在Python2中
except Myerror as err: #在Python 3中
next()函数和.next()方法
在Python 2中,next()作为生成器对象的方法是被允许的。而在Python 2中,使用next()函数对生成器对象进行迭代也是被接受的。但是在Python 3中,next()作为生成器方法被停用并引发 AttributeError 。
gen = (letter for letter in 'Hello World') #创建生成器对象
next(my_generator) #在Python 2和Python 3中都被允许
my_generator.next() #在Python 2中被允许,在Python 3中引发AttributeError
2to3工具
除了Python 3解释器外,2to3.py脚本通常也被安装在tools/scripts文件夹中。它读取Python 2.x源代码并应用一系列fixers将其转换为有效的Python 3.x代码。
以下是一个示例Python 2代码(area.py):
def area(x,y = 3.14):
a = y*x*x
print a
return a
a = area(10)
print "area",a
转换为Python 3版本:
$2to3 -w area.py
转换后的代码:
def area(x,y = 3.14): #形式参数
a = y*x*x
print (a)
return a
a = area(10)
print("area",a)