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

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

快速链接到答案:

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


当前回答

Dict理解

>>> {i: i**2 for i in range(5)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Python文档

维基百科的条目

其他回答

脚本的交互式调试(和doctest字符串)

我不认为这是广为人知的,但添加这一行到任何python脚本:

进口pdb;pdb.set_trace ()

将导致PDB调试器在代码的那一点弹出运行游标。我想,更鲜为人知的是,你可以在doctest中使用同样的行:

"""
>>> 1 in (1,2,3)   
Becomes
>>> import pdb; pdb.set_trace(); 1 in (1,2,3)
"""

然后可以使用调试器检出doctest环境。您不能真正逐级执行doctest,因为每一行都是自主运行的,但它是调试doctest glob和环境的好工具。

一些内置的收藏夹,map(), reduce()和filter()。所有这些都非常快速和强大。

pdb - Python调试器

作为程序员,要进行严肃的程序开发,首先需要的东西之一是调试器。Python有一个内置的模块,叫做pdb(自然是“Python调试器”的缩写!)

http://docs.python.org/library/pdb.html

获取python正则表达式解析树来调试正则表达式。

正则表达式是python的一个伟大特性,但调试它们可能是一件痛苦的事情,而且正则表达式很容易出错。

幸运的是,python可以通过将未记录的、实验性的隐藏标志re.DEBUG(实际上是128)传递给re.compile来打印正则表达式解析树。

>>> re.compile("^\[font(?:=(?P<size>[-+][0-9]{1,2}))?\](.*?)[/font]",
    re.DEBUG)
at at_beginning
literal 91
literal 102
literal 111
literal 110
literal 116
max_repeat 0 1
  subpattern None
    literal 61
    subpattern 1
      in
        literal 45
        literal 43
      max_repeat 1 2
        in
          range (48, 57)
literal 93
subpattern 2
  min_repeat 0 65535
    any None
in
  literal 47
  literal 102
  literal 111
  literal 110
  literal 116

一旦理解了语法,就可以发现错误。在这里我们可以看到,我忘记转义[/font]中的[]。

当然,你可以将它与任何你想要的标志组合在一起,比如注释正则表达式:

>>> re.compile("""
 ^              # start of a line
 \[font         # the font tag
 (?:=(?P<size>  # optional [font=+size]
 [-+][0-9]{1,2} # size specification
 ))?
 \]             # end of tag
 (.*?)          # text between the tags
 \[/font\]      # end of the tag
 """, re.DEBUG|re.VERBOSE|re.DOTALL)

利用python的动态特性来创建应用程序 python语法的配置文件。例如,如果你有以下情况 在配置文件中:

{
  "name1": "value1",
  "name2": "value2"
}

然后你可以简单地这样读:

config = eval(open("filename").read())