偏函数:就是针对原函数参数值得改变使得原函数偏爱于新的值;如下面代码所示,首先导入functools包,使用的是functools的partial,第一个参数是需要改变的函数,第二个参数是需要改变的偏爱的值;
import functools
def sum(a,b,c,d=2):
print(a+b+c+d)
pertical=functools.partial(sum,d=5)
pertical(1,2,3)
偏函数使用举例:
import functools
x='10011'
int_2=functools.partial(int,base=2)
print(int_2(x))
高阶函数:当A函数的一个参数接收是一个函数时,那么称A为高阶函数;比如sorted()函数,这里需要注意几点,key是一个参数,getkey是一个函数,这里是把函数赋给了key这个参数;
dic=[{'a':17,'n':"xt3"},{'a':15,'n':'xt1'},{'a':19,'n':'xt4'},{'a':14,'n':'xt2'}]
def getkey(d):
return d['a']
list=sorted(dic,key=getkey)
print(list)
高阶函数使用举例:如下所示,high函数就是一个高阶函数,他的一个参数接收就是一个函数,我们在high函数里面又调用了接收的这个函数;
def sum(x,y):
return x+y
def subtraction(x,y):
return x-y
def high(x,y,function):
return function(x,y)
result=high(1,2,subtraction)
print(result)
返回函数:如果A函数的返回值是一个函数,那么A就叫做返回函数
def return_function(tag):
def sum(x,y):
return x+y
def subtraction(x,y):
return x-y
if tag=="+":
return sum
else:
return subtraction
func=return_function('+')
res=func(1,2)
print(res)
匿名函数:也叫lambda函数,这个函数其实就是对函数的简化操作,我们只需要关注函数的参数,以及返回值,其他一概不关心:如下代码所示,前面一个关键字lambda,后面直接跟参数,然后一个冒号,最后的x+y就是返回值;
func=lambda x,y:x+y
print(func(1,2))
lambda函数应用举例:下面的代码就是之前使用sorted函数对列表的排序,里面有个key参数是用来接收函数的,但是这个函数其实只是需要在这里使用一次,其他地方都不使用,那我们使用lambda函数就简单很多了,就不用在外面再去写一个函数了;
dic=[{'a':17,'n':"xt3"},{'a':15,'n':'xt1'},{'a':19,'n':'xt4'},{'a':14,'n':'xt2'}]
list=sorted(dic,key=lambda x:x['a'])
print(list)
闭包:指的是在函数嵌套的情况下,内层函数调用了外层函数的变量(包括参数),并且把内层函数当成返回值,那么这种情况就叫做闭包;
def out():
ot=2
def inner():
print(ot)
return inner
newFunc=out()
newFunc()
闭包的使用举例:首先申明一点,其实我们不管学习什么方式来操作代码都是为了让代码能更优雅,更方便,更好用,学这么多东西,最后需要自己去抉择到底使用什么方式去写;这个例子就是打印分隔线的例子:首先不可否认的是我们直接写一个函数也可以,但是如果这样写的话,每次去调用分隔线都需要传参,同样的参数要写多次,像我这样写的话,同样的参数只需要写一次,是不是更优雅呢,个中体会;
def config_line(content,leng):
def line():
print('*'*(leng//2)+content+'*'*(leng//2))
return line
line1=config_line('我是分隔线',14)
line1()
lin2=config_line('第90页',80)
lin2()
闭包注意事项:
1.如果内层函数要改外层函数的变量的值,那么需要加一个关键字nonlocal修饰这个变量:表示这个变量不是一个局部变量;
nonlocal leng
2.还需要注意一点是如果外层参数的值在发生变化的话,一定要理清楚内层的逻辑是怎么走的,不然会出现各种错误;