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

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

快速链接到答案:

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


当前回答

并不是一个隐藏的功能,但可能会派上用场。

用于成对遍历列表中的项

for x, y in zip(s, s[1:]):

其他回答

>>> from functools import partial
>>> bound_func = partial(range, 0, 10)
>>> bound_func()
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> bound_func(2)
[0, 2, 4, 6, 8]

不是真正的隐藏特性,但是partial对于函数的后期计算非常有用。

你可以在初始调用中绑定尽可能多的或尽可能少的参数到你想要的partial,并在以后使用任何剩余的参数调用它(在这个例子中,我已经将begin/end参数绑定到range,但第二次使用step arg调用它)

请参见文档。

对象数据模型

您可以为自己的类重写语言中的任何操作符。有关完整列表,请参阅本页。一些例子:

您可以重写任何运算符(* + - // / % ^ == < > <= >=。等等)。所有这些都是通过重写对象中的__mul__, __add__等来实现的。你甚至可以重写像__rmul__这样的东西来分别处理your_object*something_else和something_else*your_object.。是属性访问(a.b),并且可以通过使用__getattr__来重写以处理任意b。这里还包括一个使用__call__的(…)。 您可以创建自己的slice语法(a[stuff]),这可能非常复杂,与列表中使用的标准语法完全不同(numpy在其数组中有一个很好的例子,说明了这种功能的强大),使用您喜欢的、、:和…的任何组合,使用slice对象。 特别处理语言中许多关键字所发生的情况。包括del、in、import和not。 处理与对象一起调用许多内置函数时发生的情况。标准的__int__, __str__等会在这里,但__len__, __reversed__, __abs__和三个参数__pow__(用于模取幂)也会在这里。

测试键是否在字典中的简单方法:

>>> 'key' in { 'key' : 1 }
True

>>> d = dict(key=1, key2=2)
>>> if 'key' in d:
...     print 'Yup'
... 
Yup

Python 2。如果在序列的最后一个元素之后,X会忽略逗号:

>>> a_tuple_for_instance = (0,1,2,3,)
>>> another_tuple = (0,1,2,3)
>>> a_tuple_for_instance == another_tuple
True

后面的逗号会导致单个带括号的元素被视为序列:

>>> a_tuple_with_one_element = (8,)

__getattr__ ()

getattr是一种创建泛型类的好方法,在编写API时尤其有用。例如,在FogBugz Python API中,getattr用于无缝地将方法调用传递给web服务:

class FogBugz:
    ...

    def __getattr__(self, name):
        # Let's leave the private stuff to Python
        if name.startswith("__"):
            raise AttributeError("No such attribute '%s'" % name)

        if not self.__handlerCache.has_key(name):
            def handler(**kwargs):
                return self.__makerequest(name, **kwargs)
            self.__handlerCache[name] = handler
        return self.__handlerCache[name]
    ...

当有人调用FogBugz.search(q='bug')时,他们实际上不会调用搜索方法。相反,getattr通过创建一个新函数来处理调用,该函数包装了makerequest方法,该方法将适当的HTTP请求发送给web API。任何错误都将由web服务分派并传递回用户。