自《Dive into Python》以来Python的变化

12 投票
6 回答
1501 浏览
提问于 2025-04-15 12:40

我一直在自学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 个回答

3

这里有几个我想要的答案的例子:

条件表达式

在2.5版本中,提供了一种新的写法来处理条件表达式,而不是使用与或技巧

#and-or trick:
x = condition and 'true_value' or 'false_value'

#new in 2.5:
x = 'true_value' if condition else 'false_value'

检查字典中的键

has_key() 已经不推荐使用,现在可以用 key in d 来代替。

>>>d={'key':'value','key2':'value2'}
>>>'key1' in d
 True
6

书的作者Mark对此有一些评论。我毫不客气地把相关的段落复制过来了:
"""如果你选择Python 2,我只能推荐《Dive Into Python》中的第2到7章、第13到15章和第17章。书的其他部分已经过时得很严重了。"""

9

你可以查看一下 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 Truereturn 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()部分。

撰写回答