Python 高阶函数使用

高阶函数使用 —-函数式编程

Python 函数的参数可以是:字符串,整数 …普通的变量, 但 Python 函数的参数还能是一个函数返回值也能是一个函数

函数作为参数

函数 fun() 接受一个 函数f 作为参数

首先定义一个主函数

函数的第一个参数需要传入一个函数

def fun(f, a:int, b:int ):
   return f(a) + f(b)

定义参数函数,只是简单的返回参数

def f(num):
    return num

使用主函数

print(fun(f, 1, 2))
-------------------
3

函数作为返回值

定义返回值函数 f()

def f(num):
    return num **num

定义主函数 fun(),直接返回 f() 函数

def fun():
        # 不能加 括号,带括号就是 调用
        return f

使用主函数

第一个括号调用 fun() 函数,第二个括号调用返回的函数

foo = fun()
print(foo) # 一个函数
print(foo(2))
# 合并写法
print(fun()(2))
---------------
<function f at 0x000001FD81A62268>
4
4

内置的高阶函数

sort() 排序

普通排序使用

list = [1,5,6,8,7,6,5,5,2]
list.sort(reverse=True) # 降序
print(list)
---------------------------
[8, 7, 6, 6, 5, 5, 5, 2, 1]

高级使用 —按照指定规则排序

按照十位数的大小排序

# 作为参数的函数
def fun(num):
    return str(num)[0]

list = [11,51,61,82,72,64,52,512,21]
list.sort(key=fun,reverse=True)
print(list)
------------------------------------
[82, 72, 61, 64, 51, 52, 512, 21, 11]

# 使用匿名函数合并

list = [11,51,61,82,72,64,52,512,21]
list.sort(key=lambda num: str(num)[0],reverse=True)
print(list)
------------------------------------
[82, 72, 61, 64, 51, 52, 512, 21, 11]

map() & filter()

函数编程语言通常都会提供map, filter, reduce三个高阶函数。

在Python3中, mapfilter 仍然是内置函数, 但是由于引入了列表推导生成器表达式, 他们变得没有那么重要了。

列表推导生成器表达式具有了 mapfilter 两个函数的功能, 而且更易于阅读。

map

生成新的迭代类型

list_m = map(lambda num : num ** 2,[1,2,3,4,5,6,7])
print(list(list_m))
print(type(list_m))
-------------------
[1, 4, 9, 16, 25, 36, 49]
<class 'map'>

列表推导 实现 map()

list_m = [num ** 2 for num in [1, 2, 3, 4, 5, 6, 7]]
print(list_m)
-------------
[1, 4, 9, 16, 25, 36, 49]

同时迭代多个list,生成新的迭代类型的长度是最短list的长度

list1 = [10,20,30,40]
list2 = [1,2]
list_m = map(lambda a,b:a+b,list1,list2)
print(list(list_m))
-------------------
[11, 22]

注意 列表推倒中这里是使用的笛卡尔积

list1 = [10,20,30,40]
list2 = [1,2]
list_m = [a + b for a in list1 for b in list2]
print(list_m)
-------------
[11, 12, 21, 22, 31, 32, 41, 42]

filter 过滤

filter 参数函数的返回值需要是 布尔值

list_m = filter(lambda num :num%2,[1,2,3,4,5,6,7])
print(list(list_m))
-------------------
[1, 3, 5, 7]

列表推导 实现 filter()

list_m = [ num for num in [1,2,3,4,5,6,7] if num%2 == 1]
print(list_m)
-------------
[1, 3, 5, 7]

reduce

Python3 中 reduce 被移动到了 functools 模块中

from functools import reduce

用法 两两做运算

from functools import reduce
num = reduce(lambda a,b: a+b,[1,2,3,4,5,6,7],0) # 0 为 a 的初始值
print(num)
----------
28
发表评论 / Comment

用心评论~