Python3过渡笔记

Table of Contents

Python3相对Python2来说,整体变化挺大的,也改进了许多不合理的地方。Python3是Python的未来,在此做个记录。

1 统一的标准库命名规范

在Python2.x中,很多标准库的命名规则不一,如下一些风格不一的命名:

  • Queue
  • ConfigParser
  • urllib

Python3中这块得以改善,比如Queue改成了queue;ConfigParser改成了configparser。

2 print是函数

在Python2中print可以当关键字使用,比如这样使用是错误的:

>>> map(print, [1, 2, 3])
  File "<ipython-input-2-2b740877d82b>", line 1
    map(print, [1, 2, 3])
            ^
SyntaxError: invalid syntax

但在Python中,print已经明确被定义成函数,所以Python3中不会报错:

>>> list(map(print, [1, 2, 3]))
1
2
3
[None, None, None]

3 venv

无论是生产环境还是开发环境,virtualenv在Python2.x中广泛使用。Python3中则提供了和virtualenv等价功能的工具——venv。

比如新建一个名为self-python的虚拟环境:

$ pyvenv self-python
$ source self-python/bin/activate # 进入环境
(self-python) $

如果在Python2.x和Python3.x共存的系统中使用virtualenv,也可指定版本:

$ virtualenv --python /usr/bin/python2.7 self-python

4 迭代

4.1 reduce

官方认为绝大多数应该用for循环,这样可读性更好,所以从内置函数中移除了reduce函数,需要从functools库中引用:

import functools
functools.reduce(lambda a, b: a + b, range(10))

4.2 map

map函数默认返回一个迭代对象,不会执行。

在Python2中:

map(lambda i: i + 1, range(3))

会立即返回[1, 2, 3]。

而在Python中只返回map函数对象,可能是惰性计算,要得到相同结果,需要显示调用list:

list(map(lambda i: i + 1, range(3)))