python高阶函数 —— 内置高阶函数、返回值为函数、函数作为参数、闭包

一、什么是高阶函数?

高阶函数:接收函数作为参数,或者将函数作为返回值的函数是高阶函数。
当我们使用一个函数作为参数时,实际上是将指定的代码传递进了目标函数。

参数为函数

# 创建一个列表
l = [1,2,3,4,5,6,7,8,9,10]

def fn(func , lst) :
    '''
        fn()函数可以将指定列表中的所有偶数获取出来,并保存到一个新列表中返回
        参数:
            lst:要进行筛选的列表
    '''
    # 创建一个新列表
    new_list = []

    # 对列表进行筛选
    for n in lst :     
        if func(n) :
            new_list.append(n)
    # 返回新列表
    return new_list

# 被2整除
def fn2(i) :
    if i % 2 == 0 :
        return True
    return False    

# 这个函数用来检查指定的数字是否大于5
def fn3(i):
    if i > 5 :
        return True    
    return False

# 能否被3整除
def fn4(i):
     if i % 3 == 0:
         return True    
     return False
        
print(fn(fn2 , l))   # 过滤被2整除的列表
print(fn(fn3 , l))   # 大于5的列表
print(fn(fn4 , l))   # 被3整除的列表

返回值为函数

# 返回值为函数
def bar():
    print("in the bar..")
    
def foo(func):
    print("in the foo..")
    return bar # 此返回值是bar
    
res=foo(bar)

res()

以上两个示例中,函数foo()为高阶函数,示例一中函数bar作为foo的参数传入,示例二中函数bar作为foo的返回值。

注:

函数名(例如bar 、foo)–>其为该函数的内存地址;函数名+括号(例如 bar()、foo() )–>调用该函数。

二、 高阶函数1(函数作为参数)

2.1、 python 内置高阶函数(函数作为参数)

map、filter、reduce、sort、sorted

1) filter() 过滤出符合条件的元素

filter() 可以从序列中过滤出符合条件的元素,保存到一个新的序列中 。

参数:
1.函数,根据该函数来过滤序列(可迭代的结构)

​ 2.需要过滤的序列(可迭代的结构)

返回值:

​ 过滤后的新序列(可迭代的结构)

l = [1,2,3,4,5,6,7,8,9,10]

r = filter(lambda i : i > 5 , l)
print(list(r))

运行结果:

[6, 7, 8, 9, 10]
2) map() 对所有元素做指定的操作

map()函数可以对可迭代对象中的所有元素做指定的操作,然后将结果添加到一个新的对象中返回。

l = [1,2,3,4,5,6,7,8,9,10]

r = map(lambda i : i ** 2 , l)

print(list(r))
3) reduce() 合并

reduce函数的第1个参数为函数,其返回值为一个值,一般用于叠加、叠乘等。

参数说明:

  • 第1个参数: 函数
  • ​ 第2个参数: 队列
  • ​ 第3个参数: 初始值,默认为0
# reduce函数不是内置函数,而是在模块functools中的函数,故需要导入
from functools import reduce

nums=[1,2,3,4,5,6]

# reduce 函数的机制
def reduce_test(func,array,initVal=None): # initVal 作为初始值,默认为0
    if initVal == None:
        result =array.pop(0) # 如果为空时,默认为0
    else:
        result = initVal
    for i in array:
        result = func(result,i)
    return result

# 叠加
print(reduce_test(lambda x,y:x+y,nums,1))


#reduce函数,叠加
print(reduce(lambda x,y:x+y,nums,1))

运行结果:

22
4) sort() 排序

该方法用来对列表中的元素进行 排序

sort()方法默认是直接比较列表中的元素的大小
在sort()可以接收一个关键字参数 , key
key需要一个函数作为参数,当设置了函数作为参数

每次都会以列表中的一个元素作为参数来调用函数,并且使用函数的返回值来比较元素的大小

l = ['bb','aaaa','c','ddddddddd','fff']
l2=l.sort(key=len)       # len() 方法的返值来排序,即字符串的长度排序

print(l)
print(l2)

运行结果:

['c', 'bb', 'fff', 'aaaa', 'ddddddddd']
None
l3 = [2,5,'1',3,'6','4']
l4 = l3.sort(key=int) # 根 int() 函数的返回值来排序,即将所有的值转换成数字,根数值的大小排序
print(l3)
print(l4)

运行结果:

['1', 2, 3, '4', 5, '6']
None

从运行结果得知: sort() 没有返回值

5) sorted() 排序

这个函数和sort()的用法基本一致,但是sorted()可以对任意的序列进行排序
并且使用sorted()排序不会影响原来的对象,而是返回一个新对象

l = [2,5,'1',3,'6','4']
# l = "123765816742634781"
l2=sorted(l,key=int)

print('排序前:',l)
print('排序后 l:',l)
print('排序后 l2:',l2)

运行结果:

排序前: [2, 5, '1', 3, '6', '4']
排序后 l: [2, 5, '1', 3, '6', '4']
排序后 l2: ['1', 2, 3, '4', 5, '6']

2.2、普通的高阶函数(函数作为参数)

三、 高阶函数2(函数作为 返回值)—— 闭包

闭包的特点:

  • 将函数作为返回值返回,也是一种高阶函数;
  • 这种高阶函数我们也称为叫做闭包,通过闭包可以创建一些只有当前函数能访问的变量;
  • 可以将一些私有的数据藏到的闭包中;

3.1、 形成闭包的必要条件

(1)函数嵌套
(2)将内部函数作为返回值返回
(3)内部函数必须要使用到外部函数的变量

求多个数的平均值:

def make_averager():

    # 创建一个列表,用来保存数值。
    nums = []

    # 创建一个内部函数,用来计算平均值。符合(1)
    def averager(n) :
        # 将n添加到列表中。符合(3)
        nums.append(n) 
        # 求平均值
        return sum(nums)/len(nums)
    
    return averager    # 符合 (2)

调用:

averager = make_averager()  # 返回的参数 averager 是一个函数

print(averager(10))
print(averager(20))
print(averager(30))
print(averager(40))

运行结果:

10.0
15.0
20.0
25.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值