总而言之,函数式编程,廖大神一番话我啥也没听懂,先搁置。
高阶函数
1-特征
【变量可以指向函数】
x=abs(-10)
f=abs
y=f(-10)
上面运行的结果是x=10,y=10。
【函数名也是变量】
abs=10
x=abs(-10)
上面运行结果是abs=10,第二个语句报错。
【传入函数】
函数可以接受函数本身作为变量。例如
def func(a,f):
a=f(a)
return a
>>>func(-10,abs)
运行结果是10
map/reduce
简单来说就是:map对列表中所有元素进行同样的函数操作,reduce看例子
list(reduce(f,[1,2,3,4]))
====
def f(m,n):
return m*10+n
得到结果为整数1234(一千二百三十四)
即reduce(f,[x1,x2,x3,x4])=f(f(f(x1,x2),x3),x4)
fliper
根据返回的Bool值决定是否在列表中删除该元素
list(fliper(f,[1,2,3,4]))
====
def f(x):
return x%2==0
得到结果为[2,4]
sorted
排序
L=sorted(List,key=SortbyScore,reverse=True)
====
def SortbyScore(n):
return n[1]
忽略大小写反向排列
key是将List中每一个元素传入之后构造新映射List,然后对映射List排序。
返回函数
可以将函数作为返回值。与此同时,即使函数变量相同,操作相同,其返回的函数都是不可直接相等的,其调用结果是相互不影响的。
由于返回的函数是一个闭包(Closure),包含函数中的变量和函数本身,因此如:
f1,f2,f3=count()
f1()
====
def count():
fs=[]
for i in range(1,4):
def f():
return i*i
fs.append(f)
i=7
return fs
其返回结果并非f1,f2,f3分别为1,4,9,而是49。
因为在最后返回fs时,才调用i封装进闭包,此时i为7。
可想而知,当去掉i=7这个语句之后,函数f1,f2,f3的调用结果应当都是9(最后一次循环时,i=3)
故:返回函数不要引用任何它返回前的循环变量。
def count2():
def f(j):
def g():
return j*j
return g
fs=[]
for i in range(1,4):
fs.append(f(i))#由于此时,已返回闭包g,i的后续变动不再影响f(i)的值了
return fs
匿名函数
就是没有名字的函数,只能有一行完全表示的简单函数。
f=lambda x : x*x
等同于
def f(x):
return x*x
匿名函数能有效解决函数重名的情况。
装饰器
由于并搞不懂装饰器是干啥子玩意的,先跳过
网上找到一篇文章,先马住,pass
https://mp.weixin.qq.com/s?src=11×tamp=1582608739&ver=2179&signature=x8Os-54p0j6Z3L7vYanBxQ1SHZPE9NttqtPPk9mVEXxcBT9Hlw-QawB3hluCGfoRJfuBCXy02PQRopoeTn*Dk1k*ifXRhcqxF8FRfa7MD8J1*yytVpU5jFPlLFy4w8Ep&new=1
偏函数
可以将函数的默认值进行变动并固定,返回。
int2=functools.partial(int,base=2)
此写法相当于:
def int2(x,base=2):
return int(x,base)
日常调用时:
>>>int('1011',2)
>>>11
>>>int('1011')
>>>1011
======
>>>int2('1011')
>>>11
OK,函数式编程笔记施工完成,除了装饰器实在恶心,其他都可以了。