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

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

快速链接到答案:

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


当前回答

插入与追加

不是特稿,但可能会很有趣

假设您想要在列表中插入一些数据,然后反转它。最简单的方法是

count = 10 ** 5
nums = []
for x in range(count):
    nums.append(x)
nums.reverse()

然后你会想:把数字从最开始插入怎么样?所以:

count = 10 ** 5 
nums = [] 
for x in range(count):
    nums.insert(0, x)

但它却慢了100倍!如果我们设置count = 10 ** 6,它将慢1000倍;这是因为插入是O(n²),而追加是O(n)。

造成这种差异的原因是insert每次调用时都必须移动列表中的每个元素;Append只是在列表的末尾添加元素(有时它必须重新分配所有元素,但它仍然更快)

其他回答

描述符

它们是一大堆核心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有一个很棒的教程,在描述它们方面比我做得更好。

我不确定这在Python文档中的位置(或是否),但对于Python 2。x(至少2.5和2.6,我刚刚尝试过),打印语句可以用括号调用。如果您希望能够轻松地移植一些Python 2,这可能很有用。Python 3.x代码。

例子: 我们想要Moshiach Now在python 2.5, 2.6和3.x中工作。

此外,在Python 2和3中,not操作符可以用括号调用: 不是假的 而且 (假) 都应该返回True。

括号也可以用于其他语句和操作符。

编辑:把括号放在非操作符(可能是任何其他操作符)周围不是一个好主意,因为它会导致令人惊讶的情况,就像这样(发生这种情况是因为括号实际上只是在1周围):

>>> (not 1) == 9
False

>>> not(1) == 9
True

这也可以工作,对于某些值(我认为它不是一个有效的标识符名称),像这样: not'val'将返回False, print'We want Moshiach Now'将返回We want Moshiach Now。(但是not552会引发NameError,因为它是一个有效的标识符名称)。

一切都是动态的

“没有编译时”。Python中的一切都是运行时。模块是通过从上到下执行模块的源代码来“定义”的,就像脚本一样,得到的命名空间是模块的属性空间。类似地,类是通过从上到下执行类主体来“定义”的,生成的名称空间是类的属性空间。类主体可以包含完全任意的代码——包括导入语句、循环和其他类语句。像有时要求的那样,“动态”创建一个类、函数甚至模块并不难;事实上,这是不可能避免的,因为一切都是“动态的”。

主要信息:)

import this
# btw look at this module's source :)

De-cyphered:

蒂姆·彼得斯的《Python之禅》 美总比丑好。 显性比隐性好。 简单比复杂好。 复杂胜过复杂。 扁平比嵌套好。 稀疏比密集好。 可读性。 特殊情况并不特别到可以打破规则。 尽管实用性胜过纯洁性。 错误绝不能悄无声息地过去。 除非明确保持沉默。 面对模棱两可,拒绝猜测的诱惑。 应该有一种——最好只有一种——明显的方法来做到这一点。 除非你是荷兰人,否则这种方式一开始可能并不明显。 现在总比没有好。 虽然永远不比现在更好。 如果实现很难解释,那就是一个坏主意。 如果实现很容易解释,这可能是一个好主意。 名称空间是一个非常棒的想法——让我们多做一些吧!

在Python中解压缩不需要的文件

有人在博客上说Python没有zip()的解压缩函数。Unzip的计算很简单,因为:

>>> t1 = (0,1,2,3)
>>> t2 = (7,6,5,4)
>>> [t1,t2] == zip(*zip(t1,t2))
True

但经过反思,我宁愿使用显式的unzip()。