导航
导航
文章目录
  1. 15.1 特殊的方法
  2. 15.2 单语句块
  3. 15.3 列表综合
    1. 使用列表综合
    2. 输出
    3. 如何工作
  4. 15.4 在函数中接收元组和列表
  5. 15.5 lambda形式
    1. 输出
    2. 如何工作
  6. 15.6 exec和eval语句
  7. 15.7 assert语句
  8. 15.8 repr函数

简明Python教程-15.更多Python的内容

15.1 特殊的方法

在类中,有一些特殊的方法具有特殊的意义,例如__init__和__del__方法
一般来说,特殊的方法都被用来模仿某个行为
例如,想为自己的类使用myclass[key]这样的索引操作,只需要实现__getitem__()方法即可(Python对list类就是这样做的)
下表列出了一些有用的特殊方法,Python参考手册中有所有特殊方法的庞大列表

名称 说明
__init__(self,…) 这个方法在新建对象恰好要被返回使用之前被调用。
__del__(self) 恰好在对象要被删除之前调用。
__str__(self) 在我们对对象使用print语句或是使用str()的时候调用。
__lt__(self,other) 当使用 小于 运算符(<)的时候调用。类似地,对于所有的运算符(+,>等等)都有特殊的方法。
__getitem__(self,key) 使用x[key]索引操作符的时候调用。
__len__(self) 对序列对象使用内建的len()函数的时候调用。

15.2 单语句块

Python中每一个语句块,是通过缩进层次来与其他块区分开的
但当语句块只包含一句语句时,可以在条件语句或循环语句的同一行指明它:

1
2
3
4
>>> flag = True
>>> if flag: print 'Yes'
...
Yes

单个语句被直接使用,而不是作为一个独立的块,这样程序显得简短
但强烈建议不要使用这种缩略方法,主要理由是使用恰当地缩进可以方便地添加额外的语句
并且在使用交互模式的Python解释器时会出现非预期的效果

15.3 列表综合

通过列表综合,可以从一个已有的列表,导出一个新的列表
例如,有一个数的列表,想得到一个对应的列表,使其中所有大于2的数都是原来的2倍

使用列表综合

1
2
3
4
5
6
#!/usr/bin/python
# Filename: list_comprehension.py

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

输出

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

如何工作

为满足条件(if i > 2)的数指定了一个操作(2*i),从而导出一个新的列表
原来的列表并没有发生变化
列表综合相对于循环,提供了一种更加精确、简洁、清楚的方法来完成相同的工作

15.4 在函数中接收元组和列表

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

1
2
3
4
5
6
7
8
9
10
11
12
>>> def powersum(power, *args):
... '''Return the sum of each argument raised to specified power.'''
... total = 0
... for i in args:
... total += pow(i, power)
... return total
...
>>> powersum(2, 3, 4)
25

>>> powersum(2, 10)
100

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

15.5 lambda形式

lambda语句用来创建新的函数对象,并在运行时返回它们:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python
# Filename: lambda.py

def make_repeater(n):
return lambda s: s*n

twice = make_repeater(2)

print twice('word')
print twice(5)

输出

1
2
3
$ python lambda.py
wordword
10

如何工作

make_repeater函数在运行时创建新的函数对象,并返回它
本质上,lambda需要一个参数,后面仅跟单个表达式作为函数体,并由新建的函数返回表达式的值
注意,即便是print语句也不能用在lambda形式中,只能使用表达式

15.6 exec和eval语句

exec语句用来执行储存在字符串或文件中的Python语句
例如,可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句:

1
2
>>> exec 'print "Hello World"'
Hello World

evel语句用来计算存储在字符串中的有效Python表达式:

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

15.7 assert语句

assert语句用来声明某个条件是真的
例如,检验一个列表中至少有一个元素,并在非真的时候引发一个错误,则应使用assert语句,当assert语句失败时,会引发一个AssertionError

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

15.8 repr函数

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

1
2
3
4
5
6
>>> i = []
>>> i.append('item')
>>> `i`
"['item']"
>>> repr(i)
"['item']"

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