#抽象 8.40am-
1.懒惰即美德
2.抽象和结构
3.创建函数
内建的callable
函数可以判定函数是否可以调用
>>> import math
>>>
x=1
>>> y=math.sqrt
>>>
callable(x)
False
>>>
callable(y)
True
使用def"函数定义"语句
def hello(name):
return
‘hello,‘+name+‘!‘
print hello(‘tom‘)
>>>
hello,tom!
计算数字是前两个数字之和的数列
def fibs(num):
result=[0,1]
for i in range(num-2):
result.append(result[-2]+result[-1])
return result
print fibs(10)
>>>
[0, 1, 1, 2, 3, 5, 8, 13,
21, 34]
记录函数 可以加上注释头 .__doc__可以读出来
def square(x):
"calculates the number"
return x*x
print
square.__doc__
>>>
calculates the number
help函数
也可以查看注释
print help(square)
Help on function square in module
__main__:
square(x)
calculates the number
并非真正函数的函数
def
test():
print ‘hello‘
return #会结束此函数
print
‘word‘
>>>test()
hello 不会继续往下执行
x=test()
print x
会返回一个None 没有返回值就会返回一个None
4.参数魔法
函数内为参数赋予新值不会改变外部参数
def
x(n):
n=‘a‘
m=‘b‘
x(m)
>>>x(m)
b
而列表会变化的
函数重新赋值会操作同一个的列表 建议使用副本
def x(n):
n[0]=‘a‘
m=[‘b‘,‘c‘]
x(m)
>>>m
[‘a‘,‘c‘]
输入姓名
def
init(data):
data[‘first‘]={}
data[‘middle‘]={}
data[‘last‘]={}
以上初始化语句
storage={}
init(storage)
print
storage
>>>
{‘middle‘: {}, ‘last‘: {}, ‘first‘: {}}
def inc(x):return
x+1
foo=10
foo=inc(foo)
>>>foo
11
关键字参数和默认值
hello(greeting=‘hello‘,name=‘world‘)
print
‘%s,$s!‘%(greeting,name)
使用赋值 则不用考虑位置的问题
参数名和值一定要对应这类使用参数名提供的参数叫做关键字参数
可以明确每个参数的作用
store(‘mr li‘,10,20,13,4) 这就比较难懂
store(patient=‘mr
li‘,hour=10,minute=20,day=13,month=5)
这就比较清晰
关键字参数可以给参数提供默认值
hello(name=‘tom‘)
>>>hello
tom
多个参数,*号表示多个参数
def
print_params(*params)
>>>print_params(1,2,3)
(1,2,3)
def
print_params(x,y,z=3,*pospar,**keypar):
print x,y,z
print
popspar
print
keypar
>>>print_params(1,2,3,4,5,6,7,foo=1,bar=2)
123
(5,6,7)
{‘foo‘:1,‘bar‘:2}
>>>print_params(1,2)
1
2 3
()为空
{}为空
反转过程
收集参数
def add(x,y):
return
x+y
params=(1,2)
print
add(*params)
>>>params={‘name‘:‘tom:‘,‘age‘:‘18‘}
>>>hello(**params)
tom:18
5.作用域
除了全局作用域外
每个函数调用都会创建一个新的作用域
慎用全局变量
如果局部变量与全局变量名相同的话 要访问全局变量怎么办?
全局变量将被全局变量覆盖
要访问的话可以使用
globals()[‘parameter‘]parameter是全局与局部同名的变量
将局部变量变为全局变量:global
parameter
加上global即可
6.递归
n*(n-1)...*1
def
digui(n):
result=n
for i in range(1,n):
result*=i
return
result
print digui(5)
>>>
120
以上递归代码等同于
def
digui(n):
if n==1:
return 1
else:
return
n*digui(n-1)
print digui(5)
>>>
120
乘方:
def power(x,n):
result=1
for i in
range(n):
result*=x
return result
乘方用递归:
def
power(x,n):
if n==0:
return 1
else:
return
x*power(x,n-1)
二元查找
def search(sequence,number,lower,upper):
if
lower==upper:
assert number==sequence[upper]
return
upper
else:
middle=(lower+upper)//2
if
number>sequence[middle]:
return
search(sequence,number,middle+1,upper)
else:
return
search(sequence,number,lower,middle)
查找1-100之间的某个数
使用二分法最多只要7次判断
当然也可以使用列表的index 但是 每一个数字都要判断 那就需要100次判断 效率没有那么高