python基础(part17)--函数式编程

鄙人学习笔记
开发工具:Spyder



函数式编程

  • 定义

函数式编程可以用一系列函数解决问题。

  • 说明

①函数可以赋值给变量,赋值后变量绑定函数。
②允许将函数作为参数传入另一个函数。
③允许函数返回一个函数。

  • 高阶函数

高阶函数是将函数作为参数或返回值的函数

举个例子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
  • 举个例子

最大值:

结果:

函数作为返回值

未完待续,暂时不想写了。

发布了116 篇原创文章 · 获赞 22 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/m0_37422217/article/details/105158362