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

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

快速链接到答案:

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


当前回答

Python的位置和关键字展开可以动态使用,而不仅仅是从存储的列表中使用。

l=lambda x,y,z:x+y+z
a=1,2,3
print l(*a)
print l(*[a[0],2,3])

它通常在以下情况下更有用:

a=[2,3]
l(*(a+[3]))

其他回答

getattr内置函数:

>>> class C():
    def getMontys(self):
        self.montys = ['Cleese','Palin','Idle','Gilliam','Jones','Chapman']
        return self.montys


>>> c = C()
>>> getattr(c,'getMontys')()
['Cleese', 'Palin', 'Idle', 'Gilliam', 'Jones', 'Chapman']
>>> 

如果你想根据上下文分派函数,这很有用。参见深入了解Python中的示例(此处)

很明显,反重力模块。 xkcd # 353

Iter()可以接受一个可调用参数

例如:

def seek_next_line(f):
    for c in iter(lambda: f.read(1),'\n'):
        pass

iter(callable, until_value)函数反复调用callable并生成结果,直到返回until_value。

能够替换甚至像文件删除,文件打开等-语言库的直接操作。这在测试时是一个巨大的优势。你不必把所有东西都包装在复杂的容器里。只需要替换一个函数/方法就可以了。这也被称为猴子修补。

描述符

它们是一大堆核心Python特性背后的魔力。

当您使用点访问来查找成员(例如x.y)时,Python首先在实例字典中查找成员。如果没有找到,则在类字典中查找。如果它在类字典中找到它,并且对象实现了描述符协议,而不是仅仅返回它,Python就会执行它。描述符是任何实现__get__、__set__或__delete__方法的类。

下面是如何使用描述符实现自己的(只读)属性版本:

class Property(object):
    def __init__(self, fget):
        self.fget = fget

    def __get__(self, obj, type):
        if obj is None:
            return self
        return self.fget(obj)

你可以像使用内置属性()一样使用它:

class MyClass(object):
    @Property
    def foo(self):
        return "Foo!"

在Python中,描述符用于实现属性、绑定方法、静态方法、类方法和插槽等。理解它们可以很容易地理解为什么以前看起来像Python“怪癖”的很多东西是这样的。

Raymond Hettinger有一个很棒的教程,在描述它们方面比我做得更好。