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

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

快速链接到答案:

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


当前回答

每次打印一屏多行字符串

没有真正有用的功能隐藏在网站。_Printer类,其license对象是一个实例。调用后者时,打印Python许可证。可以创建另一个相同类型的对象,传递一个字符串——例如文件的内容——作为第二个参数,并调用它:

type(license)(0,open('textfile.txt').read(),0)()

这将打印一次按一定行数分割的文件内容:

...
file row 21
file row 22
file row 23

Hit Return for more, or q (and Return) to quit:

其他回答

创建具有相关数据的两个序列的字典

In [15]: t1 = (1, 2, 3)

In [16]: t2 = (4, 5, 6)

In [17]: dict (zip(t1,t2))
Out[17]: {1: 4, 2: 5, 3: 6}

私有方法和数据隐藏(封装)

在Python中有一个常见的习惯用法,即通过以下划线开头的名称来表示不打算成为类外部API一部分的方法和其他类成员。这很方便,在实践中效果很好,但它给人一种错误的印象,即Python不支持私有代码和/或数据的真正封装。事实上,Python会自动为您提供词法闭包,这使得在真正需要的情况下以更加防弹的方式封装数据变得非常容易。下面是一个使用这种技术的类的例子:

class MyClass(object):
  def __init__(self):

    privateData = {}

    self.publicData = 123

    def privateMethod(k):
      print privateData[k] + self.publicData

    def privilegedMethod():
      privateData['foo'] = "hello "
      privateMethod('foo')

    self.privilegedMethod = privilegedMethod

  def publicMethod(self):
    print self.publicData

这里有一个使用它的人为的例子:

>>> obj = MyClass()
>>> obj.publicMethod()
123
>>> obj.publicData = 'World'
>>> obj.publicMethod()
World
>>> obj.privilegedMethod()
hello World
>>> obj.privateMethod()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute 'privateMethod'
>>> obj.privateData
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute 'privateData'

关键是privateMethod和privateData根本不是obj的属性,所以它们不能从外部访问,也不会出现在dir()或类似的文件中。它们是构造函数中的局部变量,在__init__之外完全不可访问。然而,由于闭包的魔力,它们实际上是与它们关联的对象具有相同生命周期的每个实例变量,尽管除了(在本例中)调用privilegedMethod之外没有办法从外部访问它们。通常这种非常严格的封装是多余的,但有时它确实可以非常方便地保持API或名称空间的干净。

在Python 2中。在X中,拥有可变私有状态的唯一方法是使用可变对象(例如本例中的dict)。很多人都说这有多烦人。Python 3。x将通过引入PEP 3104中描述的nonlocal关键字来消除此限制。

在调试复杂的数据结构时,pprint模块非常方便。

从文件中引用…

>>> import pprint    
>>> stuff = sys.path[:]
>>> stuff.insert(0, stuff)
>>> pprint.pprint(stuff)
[<Recursion on list with id=869440>,
 '',
 '/usr/local/lib/python1.5',
 '/usr/local/lib/python1.5/test',
 '/usr/local/lib/python1.5/sunos5',
 '/usr/local/lib/python1.5/sharedmodules',
 '/usr/local/lib/python1.5/tkinter']

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

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

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

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

三元运算符

>>> 'ham' if True else 'spam'
'ham'
>>> 'ham' if False else 'spam'
'spam'

这是在2.5中添加的,在此之前你可以使用:

>>> True and 'ham' or 'spam'
'ham'
>>> False and 'ham' or 'spam'
'spam'

然而,如果你想要处理的值被认为是假的,有一个区别:

>>> [] if True else 'spam'
[]
>>> True and [] or 'spam'
'spam'