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

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

快速链接到答案:

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


当前回答

解包语法在最近的版本中进行了升级,如示例中所示。

>>> a, *b = range(5)
>>> a, b
(0, [1, 2, 3, 4])
>>> *a, b = range(5)
>>> a, b
([0, 1, 2, 3], 4)
>>> a, *b, c = range(5)
>>> a, b, c
(0, [1, 2, 3], 4)

其他回答

特殊的方法

绝对的权力!

将值发送到生成器函数。例如有这样的函数:

def mygen():
    """Yield 5 until something else is passed back via send()"""
    a = 5
    while True:
        f = (yield a) #yield a and possibly get f in return
        if f is not None: 
            a = f  #store the new value

您可以:

>>> g = mygen()
>>> g.next()
5
>>> g.next()
5
>>> g.send(7)  #we send this back to the generator
7
>>> g.next() #now it will yield 7 until we send something else
7

python成语x =…如果……其他的……远优于x =…和…还是……原因如下:

尽管声明

x = 3 if (y == 1) else 2

等于

x = y == 1 and 3 or 2

如果使用x =…和…还是……成语,有一天你可能会被这种棘手的情况所困扰:

x = 0 if True else 1    # sets x equal to 0

因此不等于

x = True and 0 or 1   # sets x equal to 1

要了解更多正确的方法, 参见Python的隐藏特性。

上下文管理器和“with”语句

在PEP 343中引入的上下文管理器是作为一组语句的运行时上下文的对象。

由于该特性使用了新的关键字,它是逐渐引入的:在Python 2.5中通过__future__指令可用。Python 2.6及以上版本(包括Python 3)默认情况下可用。

我经常使用“with”语句,因为我认为这是一个非常有用的结构,下面是一个快速演示:

from __future__ import with_statement

with open('foo.txt', 'w') as f:
    f.write('hello!')

这里在幕后发生的事情是,“with”语句在文件对象上调用特殊的__enter__和__exit__方法。如果with语句体引发任何异常,异常细节也会传递给__exit__,允许在那里进行异常处理。

在这种特殊情况下,这为您做的是,当执行超出with套件的范围时,它保证关闭文件,无论这是正常发生还是抛出异常。它基本上是一种抽象出常见异常处理代码的方法。

其他常见的用例包括线程锁定和数据库事务。

可以从一组长度为2的序列构建字典。当你有一个值列表和数组列表时,这非常方便。

>>> dict([ ('foo','bar'),('a',1),('b',2) ])
{'a': 1, 'b': 2, 'foo': 'bar'}

>>> names = ['Bob', 'Marie', 'Alice']
>>> ages = [23, 27, 36]
>>> dict(zip(names, ages))
{'Alice': 36, 'Bob': 23, 'Marie': 27}