1. 什么是高阶函数
高阶函数就是传入的参数或者输出的结果中有一个为函数的函数。
或者说:
如果函数传入的参数中,或者输出的结果(函数只有一个结果)中有任意一个为函数,那么这个原函数就是高阶函数。
1 | def counter(base): |
- 函数counter是不是一个高阶函数?
函数counter是一个高阶函数,因为return中的inc是一个函数。
- 上面代码有没有问题?如何改进。
base += step 将会改变变量base的值,base是上层函数的变量。
改进:可以使用nonlocal关键字。产生UnboundLocalError错误。 - 如何调用完成计算功能?
foo = counter(11)
- f1 = counter(5)和f2 =counter(5),f1和f2 是否相等?为什么。
f1 == f2 is false
两者id不一样。
理解不了代码,只能测试一下了。。但是为啥会出现这样的情况呢?
1 | def counter1(base=20): |
1 | foo = counter1() |
1 | foo() #此处传入的值是内层inc的参数。。虽然不知道为啥,但就是这样表现的。 |
30
1 | # 测试下给foo = counter1() 赋值 |
1 | foo() #说明此处赋值是给外层函数counter1的参数赋值,内层函数inc的默认值无变化 |
50
1 | # 测试下给foo() 赋值 |
1 | foo(25) #说明此处赋值是给内层函数inc的参数赋值,外层函数counter1的默认值无变化 |
45
参数传入的问题解决了,但是为什么一直运行foo(25),值会一直变化呢?
1 | def coun(base=20): |
1 | foo(25) #第一次运行 |
35
1 | foo(25) #第二次运行 |
60
因为nonlocal关键字将base的变量拿到内层函数inc的内部,然后base += step 将base的值改变了。因为coun函数未结束,所以变量改变的值会一直替换原来的值。
最终这样就实现按照步长(step)一直累加的功能。step = 1 就是简单的计数功能。
由于博客的格式问题,把代码中的#去掉,就可以很明显的看到效果了。
2. 实现sort函数的功能
sort将原来的函数进行排序,输出一个新的列表,可以控制正序还是逆序。
思路:
1,两个列表一个原列表(需要进行排序的列表),一个新列表(输出的列表);
2,依次取出原列表的数字,和新列表的数字进行比较,比较大的放在前面(实现了逆序,从大到小排列);
3,第一次输出的列表没有值,需要在原列表中取一个直接放入。
1. 实现排序功能
1 | oldlst = [1,4,5,21,4,22,23,-11] |
[23, 22, 21, 5, 4, 4, 1, -11]
2. 实现参数控制排序
1 | lst = [1,4,5,2] |
[1, 2, 4, 5]
特别说明:
1 | #其中 |
控制符号的部分提取出来
1 | def compare(a,b,reverse=False): |
[1, 2, 4, 5]
3. 把compare函数放在sort函数的参数位置
1 | #引入lambda函数 |
[5, 4, 2, 1]
3. 柯里化
柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
z = f(x,y) 转换为z=f(x)(y)的形式。
1 | def add(x,y): |
3
1 | def add(x): |
11
看完还是很懵逼,,在“装饰器”里继续说说吧。。