一、函数的高阶特性。
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())