第五天:抽象
1、 函数
检测函数是否可调用:callable
>>> import math
>>> y=math.sqrt
>>> callable(y)
True
>>> x=1
>>> callable(x)
False
注意:Python3.0不在支持callable,需要使用表达式hasattr(func,_call_call_)代替
创建函数:def functionname(params):
>>>def fibs(num):
... 'Get fibonaqi sequnce! '
... result=[0,1]
... for i in range(num-2):
... result.append(result[-2]+result[-1])
... return result
...
>>>fibs(10)
[0, 1,1, 2, 3, 5, 8, 13, 21, 34]
用于def后面的'Getfibonaqi sequnce! '添加文档字符串,相当于注释#,使用help()可以查询函数的文档字符串
help(fibs)
Help on function fibs in module __main__:
fibs(num)
Getfibonaqi sequnce!
...skipping...
Help on function fibs in module __main__:
fibs(num)
Getfibonaqi sequnce!
return后不加值,只表示函数的结束,而没有返回值,这样可以避免应该返回序列时,意外返回None
>>> def test():
... print 'tanggao'
... return
... print 'tanggao isgood'
...
>>> x=test()
tanggao
>>> print x
None
2、 参数对外部变量影响
函数内给参数赋值,不会改变外部变量的值,参数存储在局部作用域中
>>> def try_to_change(n):
... n=3
...
>>> t=4
>>> try_to_change(t)#虽然在函数内部重新赋值,但外部不变
>>> t
4
但是对于可改变的数据结构,如列表,参数的内部赋值会改变外部变量的值
内部参数与外部变量指向同一个列表,所以会被修改
若不想改变外部列表,可以传进一个副本
>>> def change(n):
... n[0]='tanggao'
...
>>> names=['hello','world']
>>> change(names)
>>> names
['tanggao', 'world']
>>> #采用普通方法进行模拟
...
>>> names=['hello','world']
>>> n=names
>>> n[0]='tanggao'
>>> names
['tanggao', 'world']
完整示例——存储名字,并能用名字、中间名或姓来查找联系人
若名字为'MagusLie Hetland'存储格式类似
data = {
'first':{ 'Magus': 'Magus Lie Hetland'},
'middle':{'Lie': 'Magus Lie Hetland'},
'last':{'Hetland': 'Magus Lie Hetland'}
}
注意insert(index,value)函数,在列表的索引位置插入值
1. >>> def init(data): #data作为存储表,初始化
2. data['first'] = {}
3. data['middle'] = {}
4. data['last'] = {}
5.
6. >>> def store(data, full_name): #存储,将全名存储到表中
7. names = full_name.split() #将名字按空格(即first,middle,last)分开,返回列表,如'Ma Li He'返回['Ma', 'Li', 'He']
8. if len(names) == 2: names.insert(1, '')#若无中间名,则插入空来表示中间名['Mr', 'Zha']返回['Mr', '', 'Zha']
9. labels = 'first', 'middle', 'last' #元组
10. for label, name in zip(labels, names): #元组与序列间也可使用zip
11. people = lookup(data, label, name)
12. if people:
13. people.append(full_name)
14. else:
15. data[label][name] = [full_name] #当键不存在时,自动添加键值对,
16. #但如果输出不存在键对应值,则报错
17.
18. >>> def lookup(data, label, name): #查找,根据label查找是name的中间人
19. return data[label].get(name)
20.
21.
22. >>> MyNames = {}
23. >>> init(MyNames)
24. >>> store(MyNames, 'Magnus Lie Hetland')
25. >>> lookup(MyNames, 'middle', 'Lie')