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

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

快速链接到答案:

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


当前回答

特殊的方法

绝对的权力!

其他回答

如果在函数中使用exec,变量查找规则将发生巨大变化。闭包不再可能,但Python允许在函数中使用任意标识符。这为您提供了一个“可修改的locals()”,并可用于星型导入标识符。缺点是,它会使每次查找都变慢,因为变量最终会在字典中而不是在帧中的槽中结束:

>>> def f():
...  exec "a = 42"
...  return a
... 
>>> def g():
...  a = 42
...  return a
... 
>>> import dis
>>> dis.dis(f)
  2           0 LOAD_CONST               1 ('a = 42')
              3 LOAD_CONST               0 (None)
              6 DUP_TOP             
              7 EXEC_STMT           

  3           8 LOAD_NAME                0 (a)
             11 RETURN_VALUE        
>>> dis.dis(g)
  2           0 LOAD_CONST               1 (42)
              3 STORE_FAST               0 (a)

  3           6 LOAD_FAST                0 (a)
              9 RETURN_VALUE        

字典有一个get()方法

字典有一个'get()'方法。如果你执行d['key']而key不存在,你会得到一个异常。如果执行d.t get('key'),如果'key'不存在,则返回None。您可以添加第二个参数来返回该项,而不是None,例如:d.t get('key', 0)。

它非常适合做数字相加这样的事情:

Sum [value] = Sum。Get (value, 0) + 1

条件赋值

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是两个类。

创建枚举

在Python中,你可以这样做来快速创建一个枚举:

>>> FOO, BAR, BAZ = range(3)
>>> FOO
0

但是“枚举”不一定是整数值。你甚至可以这样做:

class Colors(object):
    RED, GREEN, BLUE, YELLOW = (255,0,0), (0,255,0), (0,0,255), (0,255,255)

#now Colors.RED is a 3-tuple that returns the 24-bit 8bpp RGB 
#value for saturated red

虽然不是很python化,但可以使用print来写入文件

打印>>outFile, 'I am Being Written'

解释:

这种形式有时被称为 “打印雪佛龙。”在这种形式中, 第一个表达式>后>必须 求值为“类文件”对象, 具体来说,一个对象具有 如上所述编写()方法。 有了这个扩展形式, 随后的表达式被打印到 这个文件对象。如果第一个 表达式的值为None sys。的文件使用Stdout 输出。