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

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

快速链接到答案:

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


当前回答

reversed()内置。在很多情况下,它使得迭代更加简洁。

简单的例子:

for i in reversed([1, 2, 3]):
    print(i)

生产:

3
2
1

然而,reversed()也适用于任意迭代器,例如文件中的行或生成器表达式。

其他回答

这不是一个隐藏的功能,但仍然很好:

import os.path as op

root_dir = op.abspath(op.join(op.dirname(__file__), ".."))

保存大量字符时,操作路径!

你可以通过查看对象的__ module__属性来询问它来自哪个模块。这很有用,例如,如果您正在命令行上进行实验,并且导入了很多东西。

同样,你可以通过查看模块的__ file__属性来询问它来自哪里。这在调试路径问题时很有用。

你可以按需构造kwargs函数:

kwargs = {}
kwargs[str("%s__icontains" % field)] = some_value
some_function(**kwargs)

str()调用在某种程度上是需要的,因为python会抱怨它不是字符串。不知道为什么;) 我在django对象模型中使用这个动态过滤器:

result = model_class.objects.filter(**kwargs)

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中的示例(此处)

嵌套列表推导式和生成器表达式:

[(i,j) for i in range(3) for j in range(i) ]    
((i,j) for i in range(4) for j in range(i) )

它们可以替换大量嵌套循环代码。