Python高阶函数


在《Python 函数是第一类对象》中,我们曾介绍过函数的一些高级用法,其中就包含了高阶函数,现在是时候深入了!

所谓高阶函数(Higher-order function),是指将其他函数作为参数的函数。这有助于增强 Python,使我们的代码更加简单、可读。

常见的高阶函数有:map()、filter()、reduce()、sorted(),一起来看看它们的用法吧!

网络图片,很形象 

1

map()

基础语法:

map(func, *iterables) --> map object
  • 作用:对序列进行函数映射。

  • 原理:func 函数将作用于 iterables 的每一项,最后将结果作为新的迭代器返回。

例如,要得到 10 以内的偶数,可以这样写:

>>> evens = map(lambda n: n*2, range(5))
>>> evens
<map object at 0x000001E099F1AA90>

在这里,map 返回了一个迭代器,好处是它节省了内存,但不好的一点是只能迭代一次。

如果需要多次迭代,或者按索引访问元素,那么可以从迭代器中创建一个列表:

>>> evens = list(map(lambda n: n*2, range(5)))
>>> evens
[0, 2, 4, 6, 8]

2

filter()

基础语法:

filter(function or None, iterable) --> filter object
  • 作用:过滤掉序列中不符合条件的元素,这通常适用于序列元素需要删减的情况。

  • 原理:function 函数将作用于 iterable 的每一项,只有当 function 返回 True 时,元素才会被留下来。

同样,也可以使用 filter 获得 10 以内的偶数:

>>> evens = filter(lambda n: n%2==0, range(10))
>>> evens
<filter object at 0x000001E099D96E48>

与 map 类似,可以从迭代器中创建一个列表:

>>> evens = list(filter(lambda n: n%2==0, range(10)))
>>> evens
[0, 2, 4, 6, 8]

3

reduce() 

基础语法:

reduce(function, sequence[, initial]) -> value
  • 作用:对序列中的每一项进行累计操作

  • 原理:用函数 function 先对 sequence 中的第 1、2 个元素操作,得到的结果再与第 3 个元素操作 ... 以此类推,最后得到一个结果。

有了这个函数,再来重新实现下《Python 递归函数》中的阶乘:

>>> from functools import reduce
>>>
>>> def factorial(n):
...     def mult(a, b):
...         return a*b
...     return reduce(mult, range(1, n+1), 1)
...
>>>

注意:在 Python 2.x 中,reduce() 是一个内置函数。但在 3.x 中,它被移至 functools 模块。因此,在使用前要先进行导入。

尝试一下,传递几个不同的值:

>>> factorial(0)
1
>>> factorial(1)
1
>>> factorial(5)
120

4

sorted() 

基础语法:

sorted(iterable, /, *, key=None, reverse=False)
  • 作用:对所有可迭代的对象进行排序操作。它返回了一个新列表,其中包含了 iterable 中的所有项(已排序)。

  • 原理:通过 key 函数来对 iterable 的每一项进行排序,排序规则取决于 reverse,为 True 时按降序排列,为 False 时按升序排列(默认)。

需要注意的是,sorted() 并不会对序列本身进行排序,排序的是返回的新列表:

>>> l = ['Python', 'PHP', 'Java']
>>>
>>> sorted_l = sorted(l)
>>>
>>> l         # 本身并未排序
['Python', 'PHP', 'Java']
>>>
>>> sorted_l  # 排序的是返回的新列表
['Java', 'PHP', 'Python']

再来看看降序,和自定义排序:

>>> sorted(l, reverse=True)  # 按降序排列
['Python', 'PHP', 'Java']
>>>
>>> sorted(l, key=len)       # 按字符串的长度排序
['PHP', 'Java', 'Python']

·END·
 

高效程序员

谈天 · 说地 · 侃代码 · 开车

长按识别二维码,解锁更多精彩内容

专为程序员设计的数学课

11-11
<p> 限时福利限时福利,<span>15000+程序员的选择!</span> </p> <p> 购课后添加学习助手(微信号:csdn590),按提示消息领取编程大礼包!并获取讲师答疑服务! </p> <p> <br> </p> <p> 套餐中一共包含5门程序员必学的数学课程(共47讲) </p> <p> 课程1:《零基础入门微积分》 </p> <p> 课程2:《数理统计与概率论》 </p> <p> 课程3:《代码学习线性代数》 </p> <p> 课程4:《数据处理的最优化》 </p> <p> 课程5:《马尔可夫随机过程》 </p> <p> <br> </p> <p> 哪些人适合学习这门课程? </p> <p> 1)大学生,平时只学习了数学理论,并未接触如何应用数学解决编程问题; </p> <p> 2)对算法、数据结构掌握程度薄弱的人,数学可以让你更好的理解算法、数据结构原理及应用; </p> <p> 3)看不懂大牛代码设计思想的人,因为所有的程序设计底层逻辑都是数学; </p> <p> 4)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; </p> <p> 5)想修炼更好的编程内功,在遇到问题时可以灵活的应用数学思维解决问题。 </p> <p> <br> </p> <p> 在这门「专为程序员设计的数学课」系列课中,我们保证你能收获到这些:<br> <br> <span> </span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">①价值300元编程课程大礼包</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">②应用数学优化代码的实操方法</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">③数学理论在编程实战中的应用</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">④程序员必学的5大数学知识</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">⑤人工智能领域必修数学课</span> </p> <p> <br> 备注:此课程只讲程序员所需要的数学,即使你数学基础薄弱,也能听懂,只需要初中的数学知识就足矣。<br> <br> 如何听课? </p> <p> 1、登录CSDN学院 APP 在我的课程中进行学习; </p> <p> 2、登录CSDN学院官网。 </p> <p> <br> </p> <p> 购课后如何领取免费赠送的编程大礼包和加入答疑群? </p> <p> 购课后,添加助教微信:<span> csdn590</span>,按提示领取编程大礼包,或观看付费视频的第一节内容扫码进群答疑交流! </p> <p> <img src="https://img-bss.csdn.net/201912251155398753.jpg" alt=""> </p>
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值