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

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

快速链接到答案:

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


当前回答

对象数据模型

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

您可以重写任何运算符(* + - // / % ^ == < > <= >=。等等)。所有这些都是通过重写对象中的__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__(用于模取幂)也会在这里。

其他回答

以完全动态的方式创建新类型

>>> NewType = type("NewType", (object,), {"x": "hello"})
>>> n = NewType()
>>> n.x
"hello"

哪个是完全一样的

>>> class NewType(object):
>>>     x = "hello"
>>> n = NewType()
>>> n.x
"hello"

可能不是最有用的东西,但很高兴知道。

编辑:新类型的固定名称,应该是NewType,是与类语句完全相同的东西。

编辑:调整标题,以更准确地描述功能。

条件赋值

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

正如它听起来的那样:“如果y是1,则赋3给x,否则赋2给x”。注意,括号不是必需的,但是为了可读性,我喜欢它们。如果你有更复杂的东西,你也可以把它串起来:

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

虽然在某种程度上,这有点太过分了。

注意,你可以使用if…任何表达式中的Else。例如:

(func1 if y == 1 else func2)(arg1, arg2) 

这里,如果y = 1调用func1,否则调用func2。在这两种情况下,对应的函数将调用参数arg1和arg2。

类似地,以下也成立:

x = (class1 if y == 1 else class2)(arg1, arg2)

其中class1和class2是两个类。

主要信息:)

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

De-cyphered:

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

>>> float('infinity')
inf
>>> float('NaN')
nan

更多信息:

http://docs.python.org/library/functions.html#float http://www.python.org/dev/peps/pep-0754/ Python nan和inf值

解释器中的解释器

标准库的code模块允许您在程序中包含自己的read-eval-print循环,或者运行整个嵌套解释器。例:(从这里抄了我的例子)

$ python
Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> shared_var = "Set in main console"
>>> import code
>>> ic = code.InteractiveConsole({ 'shared_var': shared_var })
>>> try:
...     ic.interact("My custom console banner!")
... except SystemExit, e:
...     print "Got SystemExit!"
... 
My custom console banner!
>>> shared_var
'Set in main console'
>>> shared_var = "Set in sub-console"
>>> import sys
>>> sys.exit()
Got SystemExit!
>>> shared_var
'Set in main console'

这对于希望接受来自用户的脚本输入或实时查询VM状态的情况非常有用。

TurboGears通过一个WebConsole来使用这个功能,你可以从这个WebConsole中查询你的实时web应用程序的状态。