python中的高阶函数

文章目录:

  • 1 什么是高阶函数?
    • 1.1 高阶函数:一个函数的`函数名`作为参数传给另外一个函数
    • 1.2 高阶函数:一个函数返回值(return)为另外一个`函数`
  • 2 python内置的高阶函数
    • 2.1 高阶函数:map
      • 2.1.1 对于迭代器Iterator三种方式访问
    • 2.2 高阶函数:filter
    • 2.3 高阶函数:reduce
    • 2.4 高阶函数:sorted

1 什么是高阶函数?

只要满足下面的任意一个条件就是高阶函数

  • 1、一个函数的函数名作为参数传给另外一个函数
  • 2、一个函数返回值(return)为另外一个函数(返回为自己,则为递归)

下面分别举例详细说明:

1.1 高阶函数:一个函数的函数名作为参数传给另外一个函数


def func():print("定义一个普通函数")def high_level(func):print("定义一个高阶函数")# 在函数内部,通过传入的函数参数调用func()high_level(func)
# 结果
"""
定义一个高阶函数
定义一个普通函数
"""

把一个函数名作为参数传给另外一个函数之后,就可以在高阶函数内部调用这个函数了

1.2 高阶函数:一个函数返回值(return)为另外一个函数


def func():print("定义一个普通函数")def high_level(func):print("定义一个高阶函数")return func#  return func() 这个是直接返回函数调用,递归函数就是如此res = high_level(func)
# 高阶函数返回函数之后在调用func函数
res()
# 结果
"""
定义一个高阶函数
定义一个普通函数
"""

要高阶函数的返回值为函数,则必须要把函数作为参数传入

2 python内置的高阶函数

  • 1、map
  • 2、filter
  • 3、reduce:是functools模块中的函数,需要导入
  • 4、sorted

2.1 高阶函数:map

map函数接收的是两个参数,一个是函数名,另外一个是序列,其功能是将序列中的数值作为函数的参数依次传入到函数值中执行,然后再返回到列表中。返回值是一个迭代器对象
eg:<map object at 0x00000214EEF40BA8>

图片示例:

举例说明:

def func(x):return x**2map(func, [2,3,4,5])
print(map(func, [2,3,4,5]))
print(type(map(func, [2,3,4,5])))res = map(func, [2,3,4,5])for i in res:print(i)list(map(func, [2,3,4,5]))# 结果
"""
<map object at 0x0000022C5F15CB00>
<class 'map'>
4
9
16
25
[4, 9, 16, 25]
"""
  • 可以看出,只要用map函数,就可以让列表中的每一个数都完成一次对函数参数的调用,并将结果返回到一个可迭代对象中
  • 可以通过 list(map()) 将map函数返回的迭代对象转化为列表

高阶函数map一般 和 匿名函数 lambda联合使用

calc1 = lambda x:x**2
print(calc1(2))calc2 = lambda x, y : x*y
print(calc2(3, 5))print(list(map(calc1, [6,7,8,9])))
# 或   # 两者是一样的
print(list(map(lambda x, : x**2, [6,7,8,9])))print(list(map(calc2, [2,3,4,5], [6,7,8,9])))
# 或   # 两者是一样的
print(list(map(lambda x, y : x*y, [2,3,4,5], [6,7,8,9])))# 结果
"""
4
15
[36, 49, 64, 81]
[36, 49, 64, 81]
[12, 21, 32, 45]
[12, 21, 32, 45]
"""

2.1.1 对于迭代器Iterator三种方式访问

  • next()
  • for循环
  • 变成列表
res = map(lambda x:x**3, [2,3,4])
next(res)res = map(lambda x:x**3, [2,3,4])
for i in res:print(i)res = map(lambda x:x**3, [2,3,4])
print(list(res))

2.2 高阶函数:filter

filter函数也是接收一个函数和一个序列的高阶函数,其主要功能是过滤。其返回值也是迭代器对象,例如:<filter object at 0x000002042D25EA90>,其图示如下:

图片示例:

names=["Alex","amanda","xiaowu"]
#filter函数机制
def filter_test(func,iter):names_1=[]for i in iter:if func(i): #传入的func函数其结果必须为bool值,才有意义names_1.append(i)return names_1
#filter_test函数
print(filter_test(lambda x:x.islower(),names))#filter函数
print(list(filter(lambda x:x.islower(),names)))

传入的参数返回的是布尔值, 例如: "Tom".islower(),返回的是一个布尔值False,只有所有的字母小写返回True

2.3 高阶函数:reduce

reduce函数也是一个参数为函数,另一个参数为可迭代对象 Iterable Object(eg: list列表)。,其返回值为一个值而不是迭代器对象,故其常用与叠加、叠乘等,图示例如下:

reduce中的函数必须也要接收2个参数,执行时把前一个结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

from functools import reduce
def func(x, y):return x*10 + yreduce(func, [3,4,5,6])
# func(3,4) = 3*10+4 = 34
# func( func(3,4),5) = func(34, 5) = 34*10+5 = 345
# func( func( func(3,4), 5), 6) = 345*10 +6 = 3456# 结果
# 3456

Map/Reduce常常一起配合使用,下面的例子是一个用Map/Reduce把str转换为int的函数:

from functools import reduceDIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}def str2int(s):def fn(x, y):return x * 10 + ydef char2num(s):return DIGITS[s]return reduce(fn, map(char2num, s))# 结果
# 123456789

2.4 高阶函数:sorted

Python内置的sorted()函数就可以对list进行排序:

>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]

此外,sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。

我们再看一个字符串排序的例子:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']

默认情况下,对字符串排序,是按照ASCII的大小比较的,由于’Z’ < ‘a’,结果,大写字母Z会排在小写字母a的前面。

现在,我们提出排序应该忽略大小写,按照字母序排序。要实现这个算法,不必对现有代码大加改动,只要我们能用一个key函数把字符串映射为忽略大小写排序即可。忽略大小写来比较两个字符串,实际上就是先把字符串都变成大写(或者都变成小写),再比较。

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']

要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']

参考:
1、https://www.cnblogs.com/littlefivebolg/articles/9094942.html
2、https://www.cnblogs.com/ArsenalfanInECNU/p/9620931.html # 博客值得学习




♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠

python中的高阶函数相关推荐

  1. python什么是高阶函数_说说 Python 中的高阶函数

    高阶函数(higher-order function)指的是:接受一个函数为参数,或者把函数作为结果值返回的函数1. 1 sorted() 比较常见的高阶函数是 sorted(),其内部的关键字参数 ...

  2. Python中的高阶函数reduce

    1.reduce(fn,iter) 功能: 用fn对iter里面的第一个和第二个元素进行运算,将得到的结果和第三个元素用 fn函数运算,最后得到一个结果. 直到序列中的元素全部参与运算 2.工作原理 ...

  3. Python中的高阶函数map

    map[映射] 1.map(fn,iter)            fn:  函数             iter :  序列[可迭代对象] 2.功能: 会将iter中的每个元素用作于fn的运算中, ...

  4. Python中的高阶函数filter

    1.filter(fn,iter)     功能:将fn依次作用于iter中的每个元素,根据返回的结果确定是否需要保留元素,                如果返回的是True则表示保留,如果返回的是 ...

  5. Python中的高阶函数sorted

    1.列表名.sort()和sorted()都是对列表进行排序  2.相同点: (1)默认升序,如果要降序,则设置reverse = True (2) 都可以自定义排序规则,只需要设置key关键字   ...

  6. python核心,内建函数,高阶函数

    晨测 global和nonlocal区别 写一个递归的阶乘 回顾 1.global和nonlocal 关键字 2.函数的递归 1.查找规律 2.设置退出条件 3.性能 3.闭包 外函数中定义一个内函数 ...

  7. Python中的高阶变量

    Python中的高阶变量 文章目录 Python中的高阶变量 变量进阶 01. 变量的引用 1.1 引用的概念 1.3 函数的参数和返回值的传递 02. 可变和不可变类型 哈希 `(hash)` 03 ...

  8. 【Kotlin】Kotlin 语言集合中的高阶函数详解 ( 数据类 data class | maxBy | minBy | filter | map | any | count | find )

    文章目录 I . List 集合高阶函数引入 II . Kotlin 数据类 ( data class ) III . Java 代码 与 Kotlin 代码实现对比 ( 查询年龄最大的 ) IV . ...

  9. Kotlin中的高阶函数

    博客地址sguotao.top/Kotlin-2018- 在Kotlin中,高阶函数是指将一个函数作为另一个函数的参数或者返回值.如果用f(x).g(x)用来表示两个函数,那么高阶函数可以表示为f(g ...

最新文章

  1. Spring context:component-scan代替context:annotation-config
  2. oracle 物化视图 ORA-23413: 表 xxx.xx 不带实体化视图日志
  3. 项目管理中网络图的看法和相关参数阅读说明
  4. bean validation校验方法参数_Spring Validation最佳实践及其实现原理,参数校验没那么简单!
  5. IOS autosizing(设置控件的固定位置大小)
  6. CSDN用户服务条款
  7. [高通SDM450][Android9.0]PL2303G驱动升级
  8. win10系统WiFi突然消失打不开,终极解决方法
  9. noob_Noob的Three.js指南
  10. html中如何淡化背景图片,Word2010如何去除图片背景
  11. 从GTK、GLib到GObject与GType历史梳理
  12. 计算机提示没有有效的ip配置,教大家电脑提示以太网没有有效的ip配置怎么办...
  13. C22_OC12-protocol协议
  14. 为什么要学数学、语文?还有英语!
  15. 一种万能解锁的解决方法
  16. 同盾设备指纹简单分析及手机相关ID了解
  17. 「竞品分析报告」不会写?不知从哪收集数据?请收下这篇竞品指南
  18. 大数据技术与应用实验报告2
  19. 十进制数转换成十六进制数~C语言
  20. 一次nginx代理前端报rewrite or internal redirection cycle while internally redirecting to “/index.html“ 记录

热门文章

  1. Linux 调度器发展简述
  2. lightoj 1063 求割点
  3. python 迭代器
  4. HDU 2079 选课时间(题目已修改,注意读题) 母函数 || 多重背包
  5. 、PHP只能访问mysql_php中 mysql函数不能调用,只有mysql_query()可以用
  6. 精通python爬虫框架-精通Python爬虫从Scrapy到移动应用(文末福利)
  7. python推荐入门书籍-这些都是Python官方推荐的最好的书籍(推荐)
  8. python的优缺点-Python 有什么一般人不知道的缺点?
  9. python动态图-Python图像处理之gif动态图的解析与合成操作详解
  10. python装饰器原理-深刻理解python装饰器