1. 性能
Py3.0 运行 pystone benchmark 的速度比 Py2.5 慢 30% 。 Guido 认为 Py3.0 有极大的优化空间,在字符串和整形操作上可以取得很好的优化结果。
2. 编码
Py3.0 源码文件默认使用 utf-8 编码,这就使得以下代码是合法的:
>>> 中国 = 'china'
>>> print( 中国 )
china
3. 语法
1 )去除了 <> ,全部改用 !=
2 )去除 `` ,全部改用 repr()
3 )关键词加入 as 和 with ,还有True,False,None
4 )整型除法返回浮点数,要得到整型结果,请使用 //
5 )加入 nonlocal 语句。使用 noclocal x 可以直接指派外围(非全局)变量
6 )去除 print 语句,加入 print() 函数实现相同的功能。 同样的还有 exec 语句,已经改为 exec() 函数
1 print语句被print()函数取代了,可以使用关键字参数来替代老的print特殊语法。例如:
Old: print "The answer is", 2*2
2 New: print("The answer is", 2*2)
3 Old: print x, # 使用逗号结尾禁止换行
4 New: print(x, end=" ") # 使用空格代替换行
5 Old: print # 输出新行
6 New: print() # 输出新行
7 Old: print >>sys.stderr, "fatal error"
8 New: print("fatal error", file=sys.stderr)
9 Old: print (x, y) # 输出repr((x, y))
10 New: print((x, y)) # 不同于print(x, y)!
7)改变了顺序操作符的行为,例如x<y,当x和y类型不匹配时抛出TypeError而不是返回随即的bool值
8) 输入函数改变了:
Old:
guess = int(raw_input('Enter an integer : ')) #读取键盘输入的方法
New:
guess = int(input('Enter an integer : '))
9 )去除元组参数解包。不能 def(a, (b, c)):pass 这样定义函数了
10 )新式的 8 进制字 变 量,相应地修改了 oct() 函数。 2.x 的方式如下:
>>> 0666
438
>>> oct(438)
'0666'
3.0 这样:
>>> 0666
SyntaxError: invalid token (<pyshell#63>, line 1)
>>> 0o666
438
>>> oct(438)
'0o666'
11 )增加了 2 进制字面量和 bin() 函数
>>> bin(438)
'0b110110110'
>>> _438 = '0b110110110'
>>> _438
'0b110110110'
1 2 )扩展的可迭代解包。在 Py3.0 里, a, b, *rest = seq 和 *rest, a = seq 都是合法的,只要求两点: rest 是 list 对象和 seq 是可迭代的。
1 3 )新的 super() ,可以不再给 super() 传参数,
>>> class C(object):
def __init__(self, a):
print('C', a)
>>> class D(C):
def __init(self, a):
super().__init__(a) # 无参数调用 super()
>>> D(8)
C 8
<__main__.D object at 0x00D7ED90>
1 4 )新的 metaclass 语法:
class Foo(*bases, **kwds):
pass
1 5 )支持 class decorator 。用法与函数 decorator 一样:
>>> def foo(cls_a):
def print_func(self):
print('Hello, world!')
cls_a.print = print_func
return cls_a
>>> @foo
class C(object):
pass
>>> C().print()
Hello, world!
class decorator 可以用来玩玩狸猫换太子的大把戏。
字符串和字节串
1 )现在字符串只有 str 一种类型,但它跟 2.x 版本的 unicode 几乎一样。
2 )关于字节串,请参阅“数据类型”的第 2 条目
数据类型
1 ) Py3.0 去除了 long 类型,现在只有一种整型—— int ,但它的行为就像 2.x 版本的 long
2 )新增了 bytes 类型,对应于 2.x 版本的八位串,定义一个 bytes 字面量的方法如下:
>>> b = b'china'
>>> type(b)
<type 'bytes'>
str 对象和 bytes 对象可以使用 .encode() (str -> bytes) or .decode() (bytes -> str) 方法相互转化。
>>> s = b.decode()
>>> s
'china'
>>> b1 = s.encode()
>>> b1
b'china'
3 ) dict 的 .keys() 、 .items 和 .values() 方法返回迭代器,而之前的 iterkeys() 等函数都被废弃。同时去掉的还有 dict.has_key() ,用 in 替代它吧
面向对象
1 )引入抽象基类( Abstraact Base Classes , ABCs )。
2 )容器类和迭代器类被 ABCs 化,所以 cellections 模块里的类型比 Py2.5 多了很多。
>>> import collections
>>> print('/n'.join(dir(collections)))
Callable
Container
Hashable
ItemsView
Iterable
Iterator
KeysView
Mapping
MappingView
MutableMapping
MutableSequence
MutableSet
NamedTuple
Sequence
Set
Sized
ValuesView
__all__
__builtins__
__doc__
__file__
__name__
_abcoll
_itemgetter
_sys
defaultdict
deque
另外,数值类型也被 ABCs 化。关于这两点,请参阅 PEP 3119 和 PEP 3141 。
3 )迭代器的 next() 方法改名为 __next__() ,并增加内置函数 next() ,用以调用迭代器的 __next__() 方法
4 )增加了 @abstractmethod 和 @abstractproperty 两个 decorator ,编写抽象方法(属性)更加方便。
异常
1 ) 所以异常都从 BaseException 继承,并删除了 StardardError
2 ) 去除了异常类的序列行为和 .message 属性
3 ) 用 raise Exception(args) 代替 raise Exception, args 语法
4 ) 捕获异常的语法改变,引入了 as 关键字来标识异常实例,在 Py2.5 中:
>>> try:
... raise NotImplementedError('Error')
... except NotImplementedError, error:
... print error.message
...
Error
在 Py3.0 中:
>>> try:
raise NotImplementedError('Error')
except NotImplementedError as error: # 注意这个 as
print(str(error))
Error
5) 异常链,因为 __context__ 在 3.0a1 版本中还没有实现,这方面就不说了
模块变动
· 移除了cPickle模块,可以使用pickle模块代替。最终我们将会有一个透明高效的模块。
· 移除了imageop模块
· 移除了 audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib模块
· 移除了bsddb模块(单独发布,可以从http://www.jcea.es/programacion/pybsddb.htm获取)
· 移除了new模块
· os.tmpnam()和os.tmpfile()函数被移动到tmpfile模块下
· tokenize模块现在使用bytes工作。主要的入口点不再是generate_tokens,而是tokenize.tokenize()
其它
1 ) xrange() 改名为 range() ,要想使用 range() 获得一个 list ,必须显式调用:
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2 ) bytes 对象不能 hash ,也不支持 b.lower() 、 b.strip() 和 b.split() 方法,但对于后两者可以使用 b.strip(b’ /n/t/r/f’) 和 b.split(b’ ‘) 来达到相同目的
3 ) zip() 、 map() 和 filter() 都返回迭代器。而 apply() 、 callable() 、 coerce() 、 execfile() 、 reduce() 和 reload() 函数都被去除了
4 ) string.letters 和相关的 .lowercase 和 .uppercase 被去除,请改用 string.ascii_letters 等
5 )如果 x < y 的不能比较,抛出 TypeError 异常。 2.x 版本是返回伪随机布尔值的
6 ) __getslice__ 系列成员被废弃。 a[i:j] 根据上下文转换为 a.__getitem__(slice(I, j)) 或 __setitem__ 和 __delitem__ 调用
7 ) file 类被废弃,在 Py2.5 中:
>>> file
<type 'file'>
在 Py3.0 中:
>>> file
Traceback (most recent call last):
File "<pyshell#120>", line 1, in <module>
file
NameError: name 'file' is not defined