一、函数的高阶特性。
1, map()
#map
def f(x):
return x * x;
r = map(f, [1,2,3]) #map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
print(list(r))
r = map(f, {1,2,3})
print(list(r))
r = {1,1,2,3} #定义了一个set,set就是dict没有值得实现,采用哈希算法存储
print(r)
2, reduce()
#reduce
from functools import reduce #使用reduce需要导入
def f1(x1,x2):
return x1 * x2;
a = reduce(f1,[1,2,3]) #这里的函数f1必须有两个参数
# 可以用这个表达式解释 reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
#
print(a)
3, filter()
# 和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入
# 的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
def fil(x):
if x % 2 == 0 :
return x
r = filter(fil,[1,2,3,8,4,5,6]) #通过fil过滤出函数返回的值。
print(list(r))
4, sorted()
#sorted 可以对list进行排序,同时可以制定排序规则
r = sorted([1,8,-3,4],key=abs) #这里key指定了abs后就忽略正负进行一个排序,当然可以制定其他规则例如忽略大小写对字符串排序
print(r)
以上4个函数被称为高阶函数。
二、返回函数。
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
1, 返回函数。
#返回函数
def fun(*args): #星号是指参数可变m前面有讲过
def sum():
a = 0
for i in args :
a += i
return a
return sum
#这里的返回值是sum这个函数
print(fun(1,2,3,4,5)())#返回值函数再被运行被调用得到的结果就是求和结果
#说明两个返回值不是同一个函数,他们地址并不一样,是两个函数,互不影响
#闭包的使用,注意一点就好 : 返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
2, 匿名函数。
#匿名函数
#一个例子,lambda x: x * x 就是一个匿名函数
#关键字lambda表示匿名函数,冒号前面的x表示函数参数。
f = lambda x: x * x #可以这样写,f就可以调用匿名函数了。
3, 装饰器。
#装饰器
def fun(a):
def exc():
print("进入")
return a()
return exc
@fun
def b():
print("本身")
b() #@fun 这里就运行了b = fun(b),进入fun之后返回exc,
# 当运行b的时候调用exc开始执行,执行完了,返回a()既是传入的b,此时调用函数本身,类似动态代理
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator #这里有个3个层,
@log('text')
def a():
print("出现") #这里就是log('text')(a),,,这里的log已经调用完了,不冲突。
a()
4, 偏函数
#偏函数
import functools
int2 = functools.partial(int,x = '1',base = 2) #使用偏函数,来固定函数的某一的参数
print(int2())