在类中有一些特殊的方法具有特殊的意义,比如initdel方法,它们的重要性我们已经学习过了。

一般说来,特殊的方法都被用来模仿某个行为。例如,如果你想要为你的类使用x[key]这样的索引操作(就像列表和元组一样),那么你只需要实现getitem()方法就可以了。想一下,Python就是对list类这样做的!

下面这个表中列出了一些有用的特殊方法。如果你想要知道所有的特殊方法,你可以在《Python参考手册》中找到一个庞大的列表

表15.1 一些特殊的方法

单语句块

现在,你已经很深刻地理解了每一个语句块是通过它的缩进层次与其它块区分开来的。然而这在大多数情况下是正确的,但是并非100%的准确。如果你的语句块只包含一句语句,那么你可以在条件语句或循环语句的同一行指明它。下面这个例子清晰地说明了这一点:

就如你所看见的,单个语句被直接使用而不是作为一个独立的块使用。虽然这样做可以使你的程序变得 小一些 ,但是除了检验错误之外我强烈建议你不要使用这种缩略方法。不使用它的一个主要的理由是一旦你使用了恰当的缩进,你就可以很方便地添加一个额外的语句。

另外,注意在使用交互模式的Python解释器的时候,它会通过恰当地改变提示符来帮助你输入语句。在上面这个例子中,当你输入了关键字if之后,Python解释器把提示符改变为…以表示语句还没有结束。在这种情况下,我们按回车键用来确认语句已经完整了。然后,Python完成整个语句的执行,并且返回原来的提示符并且等待下一句输入。

列表综合

例15.1 使用列表综合

  1. listone = [2, 3, 4]
  2. listtwo = [2*i for i in listone if i > 2]
  3. print listtwo

(源文件:code/list_comprehension.py

  1. $ python list_comprehension.py
  2. [6, 8]

这里我们为满足条件(if i > 2)的数指定了一个操作(2*i),从而导出一个新的列表。注意原来的列表并没有发生变化。在很多时候,我们都是使用循环来处理列表中的每一个元素,而使用列表综合可以用一种更加精确、简洁、清楚的方法完成相同的工作。

当要使函数接收元组或字典形式的参数的时候,有一种特殊的方法,它分别使用和*前缀。这种方法在函数需要获取可变数量的参数的时候特别有用。

由于在args变量前有前缀,所有多余的函数参数都会作为一个元组存储在args中。如果使用的是*前缀,多余的参数则会被认为是一个字典的键/值对。

lambda形式

lambda语句被用来创建新的函数对象,并且在运行时返回它们。
例15.2 使用lambda形式

  1. #!/usr/bin/python
  2. # Filename: lambda.py
  3. def make_repeater(n):
  4. return lambda s: s*n
  5. twice = make_repeater(2)
  6. print twice(5)

(源文件:code/lambda.py

  1. $ python lambda.py
  2. wordword

exec和eval语句

exec语句用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。下面是一个简单的例子。

eval语句用来计算存储在字符串中的有效Python表达式。下面是一个简单的例子。

  1. >>> eval('2*3')
  2. 6

assert语句用来声明某个条件是真的。例如,如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么assert语句是应用在这种情形下的理想语句。当assert语句失败的时候,会引发一个AssertionError。

  1. >>> mylist = ['item']
  2. >>> assert len(mylist) >= 1
  3. >>> mylist.pop()
  4. 'item'
  5. >>> assert len(mylist) >= 1
  6. Traceback (most recent call last):
  7. File "<stdin>", line 1, in ?

repr函数

repr函数用来取得对象的规范字符串表示。反引号(也称转换符)可以完成相同的功能。注意,在大多数时候有eval(repr(object)) == object。

基本上,repr函数和反引号用来获取对象的可打印的表示形式。你可以通过定义类的repr方法来控制你的对象在被repr函数调用的时候返回的内容。

概括

在这一章中,我们又学习了一些Python的特色,然而你可以肯定我们并没有学习完Python的所有特色。不过,到目前为止,我们确实已经学习了绝大多数你在实际中会使用的内容。这些已经足以让你去创建任何程序了。

接下来,我们会讨论一下如何进一步深入探索Python。