高阶函数:
变量可以指向函数,函数的名字就是变量,函数可以作为其他函数的参数;
map,reduce,filter和swift一样,写法稍有差别。
map:
def f(x):
return x * x
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
需要注意的是:此处的r并非list,而是一个Iterator惰性序列,要转为list,需要
li = list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
reduce:
from functools import reduce
def add(x, y):
return x + y
reduce(add, [1, 3, 5, 7, 9])
25
filter:
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]
sorted:
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
其中key是可以自定义的排序函数
比如,我们需要按照名字中第二个字母排序
M = sorted(['bob', 'about', 'Zoo', 'Credit'], key=itemgetter(1))
['about', 'bob', 'Zoo', 'Credit']
函数作为返回值:闭包
def customer_sum(*args):
def summ():
pre = 0
for item in args:
pre = pre + item
return pre
return summ
cu_sum = customer_sum(1,10,15)
print(cu_sum())
26
函数内部定义函数,并引用了自身局部变量,我们正定义的这个函数为闭包,被引用的变量为闭合变量
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
因为所有通过同一个函数创建的闭包中引用的局部变量是共享的,切闭包不会是返回立即执行。
匿名函数:
lambda表示匿名函数
a = lambda x,y: x * x + y * y
print(a(2,5))
装饰器:
在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。原理就是高阶函数,把原来的函数包装在一个高级函数,返回。只不过需要把被包装的函数名传到外层函数@functools.wraps(func)
def log(text = 'excuate'):
def decorator(func):
@functools.wraps(func)
def wap(*args,**kw):
print(text)
print('%s' % func.__name__)
return func(*args,**kw)
return wap
return decorator
@log('装饰器')
def pStr():
print('hahahahhhahah')
pStr()
@log()
def pName():
print("KK")
pName()
装饰器
pStr
hahahahhhahah
excuate
pName
KK
偏函数:
偏函数解决的问题
在不改变原有函数的基础上把某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
列如:
利用一个 int('10000',base=2) 定义一个不需要传base的二进制字符串转十进制的函数;
int2 = functools.partial(int, base=2)
int2('1000000')
64
网友评论