自从潜入Python以来对Python的改变

Changes to Python since Dive into Python

我一直在自学Python,一直在努力钻研马克·皮尔格的Python。我和其他堆栈溢出用户一样,完全推荐它。

然而,上一次深入到Python的更新是在五年前。当我切换到3.x时,我期待着阅读关于python 3的新文章,但现在,使用django意味着我将坚持使用2.x。

如果我把深入了解Python作为学习该语言的主要资源,那么我有兴趣了解一下我遗漏了什么新的Python特性。我遇到的几个例子是

  • 迭代工具
  • 元素树

还有什么我错过的吗?

编辑:正如巴斯蒂安在回答中指出的那样,我可以直接阅读python页面中的新功能,但有时发现一个有用的堆栈溢出提示,而不是在官方文档中费力地完成完整的、全面的答案,是很有趣的。


看看Python的新功能。它拥有2.x系列中的所有版本。根据Alex的评论,您将需要查看所有用于x>2的python 2.x。

日常编码亮点:

枚举:而不是执行:

1
2
3
for i in xrange(len(sequence)):
    val = sequence[i]
    pass

你现在可以更简洁地写:

1
2
for i, val in enumerate(iterable):
    pass

这一点很重要,因为它适用于不可获取项的iterables(否则必须在值迭代的同时使用递增的索引计数器)。

日志记录:基于打印的调试的一个明智的替代方案,在log4j风格的库模块中实现了标准化。

布尔值:正确和错误,为了清楚起见增加了:return Truereturn 1更清楚的意图。

生成器:懒惰评估的表现形式

1
evens = (i for i in xrange(limit) if i % 2 == 0)

扩展片:内置支持片中的跨步。

1
assert [1, 2, 3, 4][::2] == [1, 3]

集合:对于O(1)查找语义,您不再需要执行以下操作:

1
2
pseudo_set = {'foo': None, 'bar': None}
assert 'foo' in pseudo_set

你现在可以这样做:

1
2
set_ = set(['foo', 'bar'])
assert 'foo' in set_

逆向迭代:reversed(sequence)sequence[::-1]更可读。

子进程:统一调用子进程的所有方法——捕获输出、输入、阻塞或非阻塞。

条件表达式:习语有一个问题:

1
a and b or c

也就是说,当b不稳定时。b if a else c解决了这个问题。

上下文管理:通过with语句简化资源获取/发布。

1
2
3
with open(filename) as file:
    print file.read()
# File is closed outside the `with` block.

更好的字符串格式:描述太多——请参阅str.format()下的python文档。


马克(这本书的作者)对此有一些评论。我无耻地把相关段落复制到这里:如果您选择python 2,我只能推荐"深入到python"第2-7、13-15和17章。这本书的其余部分极为过时。"


下面是几个我想回答的例子:

条件表达式

2.5提供了一种编写条件表达式的新方法,而不是和或技巧。

1
2
3
4
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()已弃用,取而代之的是d中的key。

1
2
3
>>>d={'key':'value','key2':'value2'}
>>>'key1' in d
 True


在2.4中添加了一些"次要"特性,并且在新的2.x python代码中普遍存在:decorator(2.4)和try/except/finally子句。在你做不到之前:

1
2
3
4
5
6
try:
    do_something()
except FunkyException:
    handle_exception():
finally:
    clean_up()

不过,这两种语言本质上都是句法上的糖分,因为您可以用更多的代码来做同样的事情。


1
import antigravity

参见文档


我建议您阅读"Python2.x中有什么?""文件。可能错过的一些事情:

  • 新的样式类(允许标准类型子类型、属性…)。
  • with关键字,帮助分配和释放资源。