自《Dive into Python》以来Python的变化
我一直在自学Python,主要是通过阅读Mark Pilgrim的《Dive Into Python》。我非常推荐这本书,其他Stack Overflow的用户也都这么认为。
不过,《Dive Into Python》最后一次更新是在五年前。我期待着能读到新的《Dive into Python 3》,等我转到3.x版本的时候,但现在因为使用django,我还是会继续用2.x版本。
我想知道,如果我一直用《Dive Into Python》作为学习Python的主要资源,我错过了哪些新的功能。有几个我遇到的例子是:
- itertools
- ElementTree
还有其他我错过的东西吗?
补充:正如Bastien在他的回答中提到的,我可以直接去看Python的新特性页面,但有时候在Stack Overflow上发现一些实用的小技巧,比起在官方文档中费劲地寻找全面的答案要有趣得多。
6 个回答
书的作者Mark对此有一些评论。我毫不客气地把相关的段落复制过来了:
"""如果你选择Python 2,我只能推荐《Dive Into Python》中的第2到7章、第13到15章和第17章。书的其他部分已经过时得很严重了。"""
你可以查看一下 Python的新特性。里面有所有2.x系列的版本信息。根据Alex的评论,你需要关注所有Python 2.x版本中x大于2的部分。
日常编码的一些亮点:
枚举:以前你可能需要这样做:
for i in xrange(len(sequence)):
val = sequence[i]
pass
现在你可以更简洁地写成:
for i, val in enumerate(iterable):
pass
这很重要,因为它适用于那些不能用索引访问的可迭代对象(否则你得同时使用一个递增的索引计数器和值迭代)。
日志记录:这是一个比用打印调试更合理的选择,采用了类似Log4j的标准库模块。
布尔值:增加了True和False,能让代码更清晰:return True
比return 1
更能表达意图。
生成器:一种表达式形式的惰性求值。
evens = (i for i in xrange(limit) if i % 2 == 0)
扩展切片:内置支持切片中的步长。
assert [1, 2, 3, 4][::2] == [1, 3]
集合:为了实现O(1)的查找,你不再需要这样做:
pseudo_set = {'foo': None, 'bar': None}
assert 'foo' in pseudo_set
现在你可以这样做:
set_ = set(['foo', 'bar'])
assert 'foo' in set_
反向迭代:reversed(sequence)
比sequence[::-1]
更易读。
子进程:统一了你可能想要调用子进程的所有方式——捕获输出、输入、阻塞或非阻塞。
条件表达式:有一个问题在于这个用法:
a and b or c
特别是当b为假值时。b if a else c
解决了这个问题。
上下文管理:通过with
语句简化了资源的获取和释放。
with open(filename) as file:
print file.read()
# File is closed outside the `with` block.
更好的字符串格式化:内容太多,无法一一描述——可以查看Python文档中的str.format()
部分。