|
|
|
|
移动端

3.1.2 高阶函数

《自学Python:编程基础、科学计算及数据分析》第3章Python 进阶,在本章中,我们将学习 Python的一些进阶用法,包括函数的进阶,迭代器、生成器、装饰器、上下文管理器的使用,以及 Python中的变量作用域。本节为大家介绍高阶函数。

作者:李金来源:机械工业出版社|2018-05-03 21:46

技术沙龙 | 邀您于8月25日与国美/AWS/转转三位专家共同探讨小程序电商实战

3.1.2 高阶函数

以函数作为参数,或者返回一个函数的函数都是高阶函数(High-Order Function)。

1.函数的对象性

在 Python中,函数也是一种基本类型的对象,例如:

  1. In [1]: max   
  2. Out[1]: <function max> 

对象性意味着我们可以对函数进行以下操作:

将函数作为参数传给另一个函数;

将函数作为字典的值;

将函数作为另一个函数的返回值。

我们定义这样两个函数:

  1. In [2]: def square(x):  
  2. ...: return x ** 2  
  3. ...:  
  4. In [3]: def cube(x):  
  5. ...: return x ** 3  
  6. ...: 

把它们作为字典的值构造一个字典:

  1. In [4]: d = {"power2": square,  
  2. ...: "power3": cube}  
  3. In [5]: d["power2"]  
  4. Out[5]: <function __main__.square> 

调用d["power3"](3)就相当于调用cube(3):

  1. In [6]: d["power3"](3)  
  2. Out[6]: 27 

2.以函数为参数的函数

我们可以定义这样一个函数:

  1. def apply_function(f, sq):  
  2. return [f(x) for x in sq] 

该函数接受两个参数:一个函数 f和一个序列 sq,其作用是将函数 f作用在序列 sq的每个元素上。由于参数f是一个函数,所以我们定义的这个函数是一个高阶函数。

Python中已经有map()函数实现同样的功能,其用法为:

  1. map(f, sq) 

其作用是将函数 f作用到 sq的每一个元素上去,并返回所有结果组成的列表。例如,可以将之前定义的函数square()应用到一个序列上去:

  1. In [7]: map(square, range(5))  
  2. Out[7]: [0, 1, 4, 9, 16] 

3.以函数为返回值的函数

函数的返回值也可以是个函数。

Python支持在函数中定义子函数,我们定义一个函数,利用子函数将平方和立方函数一般化:

  1. In [8]: def power_func(num):  
  2. ...: def func(x):  
  3. ...: return x ** num  
  4. ...: return func  
  5. ...: 

该函数接受一个参数num,并定义了一个子函数 func(),最终返回定义的这个子函数。在子函数func()中,我们使用了传入的 num参数。

有了这个函数,平方和立方函数可以这样定义:

  1. In [9]: square2 = power_func(2)  
  2. In [10]: square2(4)  
  3. Out[10]: 16  
  4. In [11]: cube2 = power_func(3)  
  5. In [12]: cube2(5)  
  6. Out[12]: 125 

4.固定部分参数的函数

Python的 functools模块提供了一个叫 partial()的函数,它接受一个函数作为参数,并返回一个将这个函数的一部分参数固定的新函数。

首先导入这个函数:

  1. In [13]: from functools import partial 

定义一个计算幂的函数:

  1. In [14]: def power(x, num):   
  2.     ...: return x ** num  
  3.     ...: 

该函数接受两个参数:x和它的幂次num。

使用partial()函数定义平方:

  1. In [15]: square3 = partial(power, num=2

partial()函数的第一个参数是需要固定参数的函数,后面是函数中需要固定的参数值。需要固定的参数可以采用键值对的形式指定:如“num=2”。

通过固定参数值,我们定义了一个返回值为x ** 2的函数,即平方函数:

  1. In [16]: square3(4)   
  2. Out[16]: 16 

类似地,可以让 num参数固定为3,定义立方函数如下:

  1. In [17]: cube3 = partial(power, num=3)   
  2. In [18]: cube3(2)   
  3. Out[18]: 8 

在 partial()函数中,除了键值对的形式,需要固定的参数值也可以不指定名称,按照函数定义的顺序依次固定各个参数。

例如,对于下面的用法:

  1. partial(power, 2) 

partial()函数会将 power()函数的第一个参数 x固定为 2,所以,相当于生成了一个计算 2的 n次方的函数:

  1. In [19]: partial(power, 2)(3)   
  2. Out[19]: 8  

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

网管第一课——网络组建与管理

本书针对初级网管朋友所需掌握的网络组建和网络管理技能,以示例方式编写而成,其主要特点就是实用性和可操作性非常强。 全书共分8章,分...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊