Python编程语言中有哪些鲜为人知但很有用的特性?

尽量将答案限制在Python核心。 每个回答一个特征。 给出一个例子和功能的简短描述,而不仅仅是文档链接。 使用标题作为第一行标记该特性。

快速链接到答案:

参数解包 牙套 链接比较运算符 修饰符 可变默认参数的陷阱/危险 描述符 字典默认的.get值 所以测试 省略切片语法 枚举 其他/ 函数作为iter()参数 生成器表达式 导入该 就地值交换 步进列表 __missing__物品 多行正则表达式 命名字符串格式化 嵌套的列表/生成器推导 运行时的新类型 .pth文件 ROT13编码 正则表达式调试 发送到发电机 交互式解释器中的制表符补全 三元表达式 试着/ / else除外 拆包+打印()函数 与声明


当前回答

创建枚举

在Python中,你可以这样做来快速创建一个枚举:

>>> FOO, BAR, BAZ = range(3)
>>> FOO
0

但是“枚举”不一定是整数值。你甚至可以这样做:

class Colors(object):
    RED, GREEN, BLUE, YELLOW = (255,0,0), (0,255,0), (0,0,255), (0,255,255)

#now Colors.RED is a 3-tuple that returns the 24-bit 8bpp RGB 
#value for saturated red

其他回答

从2.5开始字典有一个特殊的方法__missing__,用于调用缺少的项:

>>> class MyDict(dict):
...  def __missing__(self, key):
...   self[key] = rv = []
...   return rv
... 
>>> m = MyDict()
>>> m["foo"].append(1)
>>> m["foo"].append(2)
>>> dict(m)
{'foo': [1, 2]}

在集合中还有一个名为defaultdict的dict子类,它做了几乎相同的事情,但对于不存在的项调用了一个不带参数的函数:

>>> from collections import defaultdict
>>> m = defaultdict(list)
>>> m["foo"].append(1)
>>> m["foo"].append(2)
>>> dict(m)
{'foo': [1, 2]}

我建议将这些字典转换为常规字典,然后再将它们传递给不需要此类子类的函数。许多代码使用d[a_key]并捕获KeyErrors来检查是否存在一个项,这将向dict添加一个新项。

当使用交互式shell时,"_"包含最后一个打印项的值:

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> _
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>

激活IDE中接受它的自动完成(如IDLE, Editra, IEP),而不是做: “嗨”。(然后你按TAB键),你可以在IDE中作弊,只是制造 嗨。”(你可以看到,在开始的时候没有单引号)因为它只会跟着最新的标点符号,就像当你添加:并按enter,它直接添加了一个缩进,不知道它是否会改变,但它不再是一个提示:)

引用一个列表理解,因为它正在构建…

你可以引用一个列表推导式,因为它是由符号'_[1]'构建的。例如,下面的函数通过引用列表推导式对元素列表进行惟一化,而不改变它们的顺序。

def unique(my_list):
    return [x for x in my_list if x not in locals()['_[1]']]

迭代工具

这个模块经常被忽视。下面的例子使用itertools.chain() 扁平化列表:

>>> from itertools import *
>>> l = [[1, 2], [3, 4]]
>>> list(chain(*l))
[1, 2, 3, 4]

更多应用请参见http://docs.python.org/library/itertools.html#recipes。