python【进阶】5.一等函数(注销)

22 篇文章 0 订阅
15 篇文章 0 订阅

在 Python 中,函数是一等对象。编程语言理论家把“一等对象”定义为满足下述条件的程
序实体:

  • 在运行时创建
  • 能赋值给变量或数据结构中的元素
  • 能作为参数传给函数
  • 能作为函数的返回结果

在 Python 中,所有函数都是一等对象。

5.1 把函数视作对象

>>> def d(n):
...   '''return n!'''
...   return 1 if n<2 else n*d(n-1)
... 
>>> d(42)
1405006117752879898543142606244511569936384000000000
>>> d.__doc__
'return n!'
>>> 
# __doc__ 属性用于生成对象的帮助文本。

map 函数返回一个可迭代对象,里面的元素是把第一个参数(一个函数)应用到第二个参数(一个可迭代对象,这
里是 range(11))中各个元素上得到的结果。

>>> list(map(f,range(11)))
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]

有了一等函数,就可以使用函数式风格编程。函数式编程的特点之一是使用高阶函数。

5.2 高阶函数

接受函数为参数,或者把函数作为结果返回的函数是高阶函数(higher-orderfunction)。map 函数就是一例此外,内置函数 sorted 也是:可选的key 参数用于提供一个函数,它会应用到各个元素上进行排序。

示例 5-3:根据单词长度给一个列表排序

>>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']
>>> sorted(fruits, key=len)
['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry']

示例 5-4:根据反向拼写给一个单词列表排序

>>> def reverse(word):
...
return word[::-1]
>>> reverse('testing')
'gnitset'
>>> sorted(fruits, key=reverse)
['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']
>>>

map、filter和reduce的现代替代品

函数式语言通常会提供 map、filter 和 reduce 三个高阶函数(有时使用不同的名
称)。在 Python 3 中,map 和 filter 还是内置函数,但是由于引入了列表推导和生成器表达式,它们变得没那么重要了。
列表推导或生成器表达式具有 map 和 filter 两个函数的功能,而且更易于阅读,如示例 5-5 所示。

示例 5-5:计算阶乘列表:map 和 filter 与列表推导比较

>>> list(map(f,range(11)))
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
>>> list(map(f,range(6)))
[1, 1, 2, 6, 24, 120]
>>> [f(n) for n in range(6)]
[1, 1, 2, 6, 24, 120]
>>> list(map(f,filter(lambda n: n%2,range(6))))
[1, 6, 120]
  • 使用列表推导做相同的工作,换掉 map 和 filter,并避免了使用 lambda 表达式。

在 Python 3 中,map 和 filter 返回生成器(一种迭代器),因此现在它们的直接替代品
是生成器表达式(在 Python 2 中,这两个函数返回列表,因此最接近的替代品是列表推导.

示例 5-6
使用 reduce 和 sum 计算 0~99 之和

>>> from functools import reduce❶ 
>>> from operator import add ➋
>>> reduce(add, range(100)) ➌
4950
>>> sum(range(100)) ➍
4950
>>>

❶ 从 Python 3.0 起,reduce 不再是内置函数了。
❷ 导入 add,以免创建一个专求两数之和的函数。
❸ 计算 0~99 之和。
❹ 使用 sum 做相同的求和;无需导入或创建求和函数。

  • sum 和 reduce 的通用思想是把某个操作连续应用到序列的元素上,累计之前的结果,把
    一系列值归约成一个值。

all 和 any 也是内置的归约函数。

  • all(iterable)如果 iterable 的每个元素都是真值,返回 True;all([]) 返回 True。
  • any(iterable)只要 iterable 中有元素是真值,就返回 True;any([]) 返回 False。

5.3匿名函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值