D.3 内置函数

D.3.1 print语句或print()函数

导致Python 2.x和3.x应用程序之间断层的最常见原因之一就是print语句的改变,在3.x版本中print语句已经变成了一个内置函数,这已经不是什么秘密。根据需要,这种变化使得print()更加灵活、方便升级和方便切换。

Python 2.6和更新版本支持print语句或print()内置函数。而默认情况下使用前者,因为它应该在版本2.x语言中。在“Python 3模式”应用程序中,为了丢弃print语句而只使用print()函数,只需要从future导入print_function。

>>> print 'foo', 'bar'

foo bar

>>>

>>> from future import print_function

>>> print

<built-in function print>

>>> print('foo', 'bar')

foo bar

>>> print('foo', 'bar', sep='-')

foo-bar

前面的示例演示了print()作为函数的功能。使用print语句,我们向用户显示了字符串foo和bar,但我们无法改变字符串之间的默认分割符,即一个空格。相比之下,print()使得在它的调用中以参数sep的形式使用这个功能,它替代了默认分隔符,允许print不断演变。

需要注意的是,这是一个单向导入,也就是说,没有办法将 print()复原成语句。甚至使用“del print_function”也没有任何效果。PEP 3105详细描述了这个重大改变。

D.3.2 reduce()转移到了functools模块中

在Python 3.x中,reduce()函数已经从内置函数退变成了functools模块中的函数(使得很多Python程序员懊恼不已),这一改变开始于Python 2.6。

>>> from operator import add

>>> reduce(add, range(5))

10

>>>

>>> import functools

>>> functools.reduce(add, range(5))

10

D.3.3 其他更新

Python 3.x 中的一个关键主题就是开始更多地使用迭代器,尤其是内置函数和那些原来返回列表的方法。因为整型类型的更新,所以其他迭代器仍然正在改变。下面是 Python 3.x中改变的最引人注目的内置函数。

range()

zip()

map()

filter()

hex()

oct()

从Python 2.6开始,程序员可以通过导入future_builtins模块来访问新增的和更新的函数。下面的例子演示了旧版和新版的oct()和zip()函数。

>>> oct(87)

'0127'

>>>

>>> zip(range(4), 'abcd')

[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

>>> dict(zip(range(4), 'abcd'))

{0: 'a', 1: 'b', 2: 'c', 3: 'd'}

>>>

>>> import future_builtins

>>> future_builtins.oct(87)

'0o127'

>>>

>>> future_builtins.zip(range(4), 'abcd')

<itertools.izip object at 0x374080>

>>> dict(future_builtins.zip(range(4), 'abcd'))

{0: 'a', 1: 'b', 2: 'c', 3: 'd'}

如果在你当前的Python 2.x环境中,你只想使用Python 3.x版本的这些函数,那么你可以通过将所有的新函数导入你的命名空间来重写旧有的函数。下面的示例中用oct()演示了这种过程。

>>> from future_builtins import *

>>> oct(87)

'0o127'