App 2.0开发模式的行业看法
594
2022-10-13
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 返回了一个迭代器,好处是它节省了内存,但不好的一点是只能迭代一次。
如果需要多次迭代,或者按索引访问元素,那么可以从迭代器中创建一个列表:
>>> 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
与 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·
高效程序员
谈天 · 说地 · 侃代码 · 开车
长按识别二维码,解锁更多精彩内容
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。