鄙人学习笔记
开发工具:Spyder
文章目录
- 函数式编程
- 举个例子1
- 举个例子2
- 举个例子3
- 函数作为参数
- lambda表达式
- 举个例子1
- 内置高阶函数
- filter
- map
- sorted
- max
- 函数作为返回值
函数式编程
- 定义
函数式编程可以用一系列函数解决问题。
- 说明
①函数可以赋值给变量,赋值后变量绑定函数。
②允许将函数作为参数传入另一个函数。
③允许函数返回一个函数。
- 高阶函数
高阶函数是将函数作为参数或返回值的函数
举个例子1
看下面这段代码:
def fun01():print("fun01执行")
#将fun01方法赋值给变量a(并没有执行fun01)
a = fun01
结果:
由以上代码和结果可知,当我们把fun01直接赋值给a时,方法fun01不执行,且变量a得到了方法fun01的地址。
为了验证一下我们所说的言论,我们调用一下变量a, 间接执行函数fun01:
def fun01():print("fun01执行")
#将fun01方法赋值给变量a(并没有执行fun01)
a = fun01
a()
结果:
举个例子2
看下面这段代码:
def fun01():print("fun01执行")
def fun02(func):
print("fun02执行")
func()
我们看到函数fun02有一个参数func, 这个参数可以被调用。对于fun02的定义者而言,并不需要知道func的具体逻辑是什么。
我们将fun01作为方法fun02的参数func进行传递:
结果:
举个例子3
我有下面这个列表:
我们有很多需求,现在,我们写出一些方法来处理这些需求:
这时,我们发现大量代码是重复的,只不过有些if条件不一样。对于相同的代码,我们要提取; 对于不同的代码,我们要封装。
首先,我们提取相同点:
我们再提取不同点:
现在,我们要将不同点”封装”起来,即将不同点提取到方法中:
我们再将相同点,设计成一个可以将我们的条件函数conditionXX作为参数传入的方法:
备注:函数式编程的这种思想,也影射出了面向对象的分而治之的思想。
运行一下代码:
结果:
函数作为参数
lambda表达式
- 定义
lambda表达式是一种匿名方法。
- 作用
①lambda表达式作为参数传递时,语法简洁,优雅,代码可读性强。
②lambda表达式可随时创建和销毁,减少程序耦合度。
- 语法
定义lambda表达式:
变量 = lambda 形参:方法体调用lambda表达式:
变量(实参)- 说明
①形参没有可以不填
②方法体只能有一条语句,且不支持赋值语句。
举个例子1
首先我们写几个函数,并把它们分别改为lambda表达式:
①不带参数
代码:
我们再分别调用a01变量和fun01()方法,如下:
结果:
②带参数
我们先看一下lambda表达式的语法:
备注:方法体只能有一个,但参数可以有多个
代码:
我们再分别调用a02变量和fun02()方法,如下:
结果:
③有返回值
代码:
我们再分别调用a03变量和fun03()方法,如下:
结果:
为什么要改写成lambda表达式?
原因就是,lambda表达式,没有名字(所以我们有时候也称其为匿名方法)它可以使我们的程序更加简洁;且,当我们只想把一个方法作为参数进行传递,但是不希望直接调用这个方法时(这个方法活着的价值就是传参),我们就可以用lambda表达式。
最后备注:如果我们看见一大段相似的代码,但是其中的计算方式(算法)不一样。我们就应该将算法提取出去(lambda表达式),将共性保留下来(保留成静态函数)。
内置高阶函数
高阶函数,即将函数作为参数或返回值的函数。
对于一些内置的高阶函数,在下面的笔记中,每一个内置高阶函数我都举个例子,大概就能明白了,不明白,请自行看文档/百度。
filter
- 举个例子
先定义Enemy类和创建Enemy对象列表(这些class和列表在下面的内置高阶函数的例子中也会用到):
过滤:
结果:
map
- 举个例子
映射:
结果:
sorted
- 举个例子
①降序排序(需要用变量接收返回值)
结果:
②升序排序(需要用变量接收返回值)
结果:
max
- 举个例子
最大值:
结果:
函数作为返回值
未完待续,暂时不想写了。