天天看点

Python-高阶函数

一.函数

函数本身也可以赋值给变量,即:变量可以指向函数。

<a href="https://s5.51cto.com/wyfs02/M01/A4/47/wKioL1mntX_AsFvwAAAu6QEdFKk108.png" target="_blank"></a>

函数名其实就是指向函数的变量!

下述操作发现:abs为函数名,给abs=1重新赋值后,abs已不是函数,而是一个整数。

<a href="https://s4.51cto.com/wyfs02/M02/05/96/wKiom1mntZXAJPAaAABSXBwZsrU556.png" target="_blank"></a>

二.内置的高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

1.map

map() 函数接收两个参数,一个是函数,一个是序列, map 将传入的函数依次作用到序列的每个元素,并把结果作为新的 list 返回。

<a href="https://s5.51cto.com/wyfs02/M01/05/96/wKiom1mntzvxzjcpAABWf0ft3_w711.png" target="_blank"></a>

2.reduce

reduce 把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce 把结果继续和序列的下一个元素做累积计算。

reduce(f,[1,2,3,4])  === &gt; add(add(add(1,2),3),4)   

reduce(cheng,range(1,11))

 求10的阶乘:

<a href="https://s5.51cto.com/wyfs02/M02/05/97/wKiom1mnup3gKc7iAAA31v0xDfo530.png" target="_blank"></a>

3. filter

filter() 也接收一个函数和一个序列。和 map() 不同的时,filter() 把传入的函数依次作用于每个元素,然后根据返回值是 True还是 False 决定保留还是丢弃该元素。

<a href="https://s4.51cto.com/wyfs02/M02/05/97/wKiom1mnu7CxMMZPAABKZXovgrE520.png" target="_blank"></a>

4.sorted()

排序也是在程序中经常用到的算法。 无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。通常规定如下:

x &lt; y, return -1

x == y, return 0

x &gt; y, return 1

<a href="https://s1.51cto.com/wyfs02/M01/A4/48/wKioL1mnu-nThREvAAAgBKtLINU399.png" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M00/05/97/wKiom1mnu_-i7hgKAAAr5frHdjI077.png" target="_blank"></a>

<a href="https://s3.51cto.com/wyfs02/M00/A4/48/wKioL1mnvCCRRa7yAAByaLPqHxM737.png" target="_blank"></a>

倒序排序:

<a href="https://s1.51cto.com/wyfs02/M00/05/97/wKiom1mnvbnBgA9KAAB2x1_Qdmk788.png" target="_blank"></a>

三.函数作为返回值

高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

<a href="https://s2.51cto.com/wyfs02/M01/05/CE/wKiom1msy9SCQZ9wAACEZUuSD7M170.png" target="_blank"></a>

四.匿名函数

1.当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。

2.关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数。

<a href="https://s1.51cto.com/wyfs02/M02/A4/7F/wKioL1mszMKyEaF3AABMW_YoJyI627.png" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M02/A4/80/wKioL1msz6HxV9udAAAkuvxBM80249.png" target="_blank"></a>

3.匿名函数有只能有一个表达式,不用写 return ,返回值就是该表达式的结果。

4. 因为匿名函数没有名字,不必担心函数名冲突。 此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数。

<a href="https://s3.51cto.com/wyfs02/M00/A4/7F/wKioL1mszTrAMyIFAAAztY21CwM676.png" target="_blank"></a>

5.也可以把匿名函数作为返回值返回

<a href="https://s1.51cto.com/wyfs02/M01/05/CE/wKiom1mszgjxVqJiAAAymi5Gx1E416.png" target="_blank"></a>

6.死则运算示例:

<a href="https://s5.51cto.com/wyfs02/M00/05/CE/wKiom1ms0K-hYa_XAAErAVpvMIM039.png" target="_blank"></a>

五.装饰器

装饰器就是用来装饰函数。

想要增强原有函数的功能;

但不希望修改now()函数的定义;

在代码运行期间动态增加功能的方式;

定义的装饰器实质是返回函数的高阶函数。(试试下面的装饰器)

例一:

查看模块的运行时间

<a href="https://s5.51cto.com/wyfs02/M01/A4/7F/wKioL1mszofij4WYAACApkTvcDE515.png" target="_blank"></a>

<a href="https://s5.51cto.com/wyfs02/M00/05/CE/wKiom1mszqPR2gP4AABoXstez10856.png" target="_blank"></a>

<a href="https://s5.51cto.com/wyfs02/M02/A4/7F/wKioL1mszoeRhgU0AAA-RJauLkI755.png" target="_blank"></a>

装饰器:

可以加功能

不改变调用方式

例二:

@timer 等于 register = timer(register)

<a href="https://s1.51cto.com/wyfs02/M00/A4/80/wKioL1mszuqiut7oAABhUIAHi4Q785.png" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M02/A4/80/wKioL1mszurzszRRAABTVTJgUu0519.png" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M02/05/CE/wKiom1mszwajiVsVAABFyBikd4Q318.png" target="_blank"></a>

      本文转自一百个小排 51CTO博客,原文链接:http://blog.51cto.com/anfishr/1961202,如需转载请自行联系原作者