Python---基本知识17之函数2

偏函数:就是针对原函数参数值得改变使得原函数偏爱于新的值;如下面代码所示,首先导入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.还需要注意一点是如果外层参数的值在发生变化的话,一定要理清楚内层的逻辑是怎么走的,不然会出现各种错误;

你可能感兴趣的