在 python 中, 支持面向对象, 也支持面向过程编程. 字典, 整数等这些都是对象, 那么函数呢? 答案: 函数也是对象, 在 python 中, 一切都是对象.
一, 函数也是对象
实例
- def funca(): # 创建一个函数
- """返回 ok"""
- return 'ok'
- print(funca.__doc__)
- print(funca)
- print(funca())
- type(funca)
输出
返回 ok # __doc__ 是函数对象众多属性中的一个
- <function funca at 0x00000257BDAC2598> # 函数对象在内存中的地址
- ok # 函数的返回值
- function # funca 是 function 类的实例
为了更进一步说明函数式对象, 可以把函数赋值给其他变量, 或者把函数对象作为参数传递给其他函数.
- >>> fact = factorial
- >>> fact
- <function factorial at 0x...>
- >>> fact(5)
- 120
- >>> map(factorial, range(11))
- <map object at 0x...>
- >>> list(map(fact, range(11)))
- [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
什么是高阶函数: 接受函数为参数, 或者把函数作为结果返回的函数是高阶函数
常见高阶函数
- - map
- - filter
- - reduce
- - apply
- - sorted
- 1, sorted
内置函数 sorted : 可选的 key 参数用于提供一个函数, 它会应用到各个元素上进行排序
实例一,
根据单词长度给一个列表排序, 据单词的长度排序, 只需把 len 函数传给 key 参数
- >>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']
- >>> sorted(fruits, key=len)
- ['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry']
- >>
实例二,
根据反向拼写给一个单词列表排序, 下面例子中列表里的单词没有变, 我们只是把反向拼写当作排序条件
- >>> def reverse(word):
- ... return word[::-1]
- >>> reverse('testing')
- 'gnitset'
- >>> sorted(fruits, key=reverse)
- ['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']
- >>>
- 2,map
map()函数接收两个参数, 一个是函数, 一个是序列, map 将传入的函数依次作用到序列的每个元素, 并把结果作为新的 list 返回.
实例一,
有一个函数 f(x)=x2, 要把这个函数作用在一个 list [1, 2, 3, 4, 5, 6, 7, 8, 9]上, 就可以用 map()实现如下
- >>> def f(x):
- ... return x * x
- ...
- >>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) # map()传入的第一个参数是 f, 即函数对象本身.
- [1, 4, 9, 16, 25, 36, 49, 64, 81]
实例二,
把这个 list 所有数字转为字符串
- >>> map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])
- ['1', '2', '3', '4', '5', '6', '7', '8', '9']
- 3, reduce
reduce() 函数会对参数序列中元素进行累积.
函数将一个数据集合 (链表, 元组等) 中的所有数据进行下列操作: 用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1,2 个元素进行操作, 得到的结果再与第三个数据用 function 函数运算, 最后得到一个结果.
实例一,
- >>> from functools import reduce # 在 python3,reduce 不在作为内置函数出现
- >>> from operator import add
- >>> reduce(add, range(100))
- 4950
- >>> sum(range(100))
- 4950
- >>>
- >>> def fn(x, y):
- ... return x * 10 + y
- ...
- >>> reduce(fn, [1, 3, 5, 7, 9]) # 将序列直接转化成整数
- 13579
实例二,
将一个 str 对象转化内 int 对象
- >>> def fn(x, y):
- ... return x * 10 + y
- ...
- >>> def char2num(s):
- ... return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
- ...
- >>> reduce(fn, map(char2num, '13579'))
- 13579
参考自廖雪峰教程
4,filter
filter() 函数用于过滤序列, 过滤掉不符合条件的元素, 返回一个迭代器对象, 如果要转换为列表, 可以使用 list() 来转换.
该接收两个参数, 第一个为函数, 第二个为序列, 序列的每个元素作为参数传递给函数进行判, 然后返回 True 或 False, 最后将返回 True 的元素放到新列表中.
实例
在一个 list 中, 删掉偶数, 只保留奇数, 可以这么写:
- def is_odd(n):
- return n % 2 == 1
- filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
- # 结果: [1, 5, 9, 15]
5,map 和 filter 的替代品
在 Python 3 中, map 和 filter 还是内置函数, 但是由于引入了列表推导和生成器表达式, 它们变得没那么重要了. 列表推导或生成器表达式具有 map 和 filter 两个函数的功能, 而且更易于阅读,
计算阶乘列表: map 和 filter 与列表推导比较
- >>> list(map(fact, range(6)))
- [1, 1, 2, 6, 24, 120]
- >>> [fact(n) for n in range(6)]
- [1, 1, 2, 6, 24, 120]
- >>> list(map(factorial, filter(lambda n: n % 2, range(6))))
- [1, 6, 120]
- >>> [factorial(n) for n in range(6) if n % 2]
- [1, 6, 120]
- >>>
6, any 和 all
all(iterable): 如果 iterable 的每个元素都是真值, 返回 True;all([]) 返回 True.
any(iterable): 只要 iterable 中有元素是真值, 就返回 True;any([]) 返回 False.
一等函数
来源: http://www.bubuko.com/infodetail-2768495.html