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风格的库模块中实现了标准化。
布尔值:正确和错误,为了清楚起见增加了:
生成器:懒惰评估的表现形式
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_ |
逆向迭代:
子进程:统一调用子进程的所有方法——捕获输出、输入、阻塞或非阻塞。
条件表达式:习语有一个问题:
1 | a and b or c |
也就是说,当b不稳定时。
上下文管理:通过
1 2 3 | with open(filename) as file: print file.read() # File is closed outside the `with` block. |
更好的字符串格式:描述太多——请参阅
马克(这本书的作者)对此有一些评论。我无耻地把相关段落复制到这里:如果您选择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 关键字,帮助分配和释放资源。