python中高阶函数、偏函数、闭包的理解

1、高阶函数
什么是高阶函数?满足以下任意条件就是:
①函数形参是函数
②函数的返回值是函数

用户可以自定义高阶函数,python有自带的内置高阶函数:map函数、reduce函数、filter函数,均满足第一个条件。
map函数:
格式:map(函数引用,可迭代对象) 返回值是一个迭代器,可以通过list转换成列表。
其中函数引用可以为匿名函数,也就是lambda声明的函数
可迭代对象可以是:列表,元组,字符串
例如:

m = list(map(lambda x:x**2,[1,2,3,4]))
print(m)

运行结果:

[1, 4, 9, 16]

可以看出来上述的map函数是会列表中的每个元素按照函数的规则进行处理之后,返回值还放在原来的位置。

reduce函数
格式:reduce(函数引用,可迭代对象,initializer=None),其中函数引用和map一样,可以是函数名或者是匿名函数,可迭代对象也是一样,initializer这个是基准值。返回值一个整数。
功能:对可迭代对象中的两个两个元素按照函数的规则进行处理,返回值作为下一次处理的第一个参数值,第二个参数值则是可迭代对象的下一个值。

reduce函数需要从functools 模块导入才行。

reduce可以应用在累加、累乘的场景上。
比如:

from functools import *
m = reduce(lambda x,y:x+y,[1,2,3,4])
print(m)

运行结果:

10

上述就是实现:1+2+3+4=10
下面是reduce函数的源码:

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        value = next(it)
        value2 = next(it)
        print(value,value2)
    else:
        value = initializer
    for element in it:
        print(element)
        value = function(value, element)
    return value
sum = reduce(lambda x,y:x+y,[1,2,3,4])
print(sum)

可以看到initializer这个参数,如果设置的话,比如为10,那么就是10+1+2+3+4+5=25.

filter 函数
格式:filter(函数引用,可迭代对象)返回值是一个迭代器,可以通过list转换成列表。
其中函数引用可以为匿名函数,也就是lambda声明的函数
可迭代对象可以是:列表,元组,字符串
功能:对可迭代对象的每个元素按照函数规则就是过滤,符合条件的留下来,不符合的丢弃,最后返回一个迭代器,可以通过list进行转换成列表。
例如:

l = list(filter(lambda x:x.islower(),['I','love','China','!']))
print(l)

运行结果:

['love']

2、偏函数
偏函数的作用就是为了简化一些函数在调用过程中繁琐的参数输入,对某些固定的参数可以隐藏,通过偏函数生成一个新的函数,再在新函数的参数中传入经常变动的参数,该参数也是原函数的参数.所以偏函数就相当于给原函数进行了包装,包装之后给了另外一个名字,后面使用就用这个别名,原来的名字也是可以用的.就跟明星一样,名字都是艺名.
调用偏函数前,需要导入模块functools .
语法:partial(函数名,需隐藏的参数),返回的是函数名引用.

def s(a,b,c):
    print(c)
    return a+b

ss = partial(s,c='这个是固定的属性')
print(ss(2,3))

运行结果:

这个是固定的属性
5

上面使用partial函数对属性c进行了固定,后面就不用传递这个参数了.

3、闭包
闭包也是针对函数来说的,满足闭包的函数,需满足如下的条件:①定义函数时内部还嵌套一个函数②外部函数返回值为内部函数的引用③内部函数使用到了外部函数传递的参数.

如下代码就是一个闭包:

def outer(a,b):
    def inner():
        nonlocal a #使用并修改外部函数的变量需要声明nonlocal,否则不能修改.
        a = 100
        c = 1000
        return a*b*c
    return inner

f = outer(1,2)
g = f()
print(g)

运行结果:

200000
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如梦@_@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值