当前位置 : 主页 > 编程语言 > python >

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

来源:互联网 收集:自由互联 发布时间:2022-06-15
鄙人学习笔记 开发工具:Spyder 文章目录 ​​函数式编程​​ ​​举个例子1​​ ​​举个例子2​​ ​​举个例子3​​ ​​函数作为参数​​ ​​lambda表达式​​ ​​举个例子1​​

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



文章目录

  • ​​函数式编程​​
  • ​​举个例子1​​
  • ​​举个例子2​​
  • ​​举个例子3​​
  • ​​函数作为参数​​
  • ​​lambda表达式​​
  • ​​举个例子1​​
  • ​​内置高阶函数​​
  • ​​filter​​
  • ​​map​​
  • ​​sorted​​
  • ​​max​​

  • ​​函数作为返回值​​


函数式编程

  • 定义

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

  • 说明

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

  • 高阶函数

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

举个例子1

看下面这段代码:

def fun01():
print("fun01执行")

#将fun01方法赋值给变量a(并没有执行fun01)
a = fun01

结果:
python基础(part17)--函数式编程_赋值
由以上代码和结果可知,当我们把fun01直接赋值给a时,方法fun01不执行,且变量a得到了方法fun01的地址。

为了验证一下我们所说的言论,我们调用一下变量a, 间接执行函数fun01:

def fun01():
print("fun01执行")

#将fun01方法赋值给变量a(并没有执行fun01)
a = fun01

a()

结果:
python基础(part17)--函数式编程_赋值_02

举个例子2

看下面这段代码:

def fun01():
print("fun01执行")

def fun02(func):
print("fun02执行")
func()

我们看到函数fun02有一个参数func, 这个参数可以被调用。对于fun02的定义者而言,并不需要知道func的具体逻辑是什么。

我们将fun01作为方法fun02的参数func进行传递:
python基础(part17)--函数式编程_python_03
结果:
python基础(part17)--函数式编程_python_04

举个例子3

我有下面这个列表:

python基础(part17)--函数式编程_python_05
我们有很多需求,现在,我们写出一些方法来处理这些需求:

python基础(part17)--函数式编程_赋值_06

这时,我们发现大量代码是重复的,只不过有些if条件不一样。对于相同的代码,我们要提取; 对于不同的代码,我们要封装。

首先,我们提取相同点:

python基础(part17)--函数式编程_赋值_07
我们再提取不同点:

python基础(part17)--函数式编程_lambda表达式_08
现在,我们要将不同点”封装”起来,即将不同点提取到方法中:

python基础(part17)--函数式编程_lambda_09
我们再将相同点,设计成一个可以将我们的条件函数conditionXX作为参数传入的方法:

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

备注:函数式编程的这种思想,也影射出了面向对象的分而治之的思想。

运行一下代码:

python基础(part17)--函数式编程_赋值_11
结果:
python基础(part17)--函数式编程_lambda表达式_12

函数作为参数

lambda表达式

  • 定义

lambda表达式是一种匿名方法。

  • 作用

①lambda表达式作为参数传递时,语法简洁,优雅,代码可读性强。
②lambda表达式可随时创建和销毁,减少程序耦合度。

  • 语法

定义lambda表达式:

变量 = lambda 形参:方法体

调用lambda表达式:

变量(实参)
  • 说明

①形参没有可以不填
②方法体只能有一条语句,且不支持赋值语句。

举个例子1

首先我们写几个函数,并把它们分别改为lambda表达式:

①不带参数

代码:
python基础(part17)--函数式编程_lambda表达式_13
我们再分别调用a01变量和fun01()方法,如下:

结果:
python基础(part17)--函数式编程_lambda表达式_14

②带参数

我们先看一下lambda表达式的语法:
python基础(part17)--函数式编程_赋值_15
备注:方法体只能有一个,但参数可以有多个

代码:
python基础(part17)--函数式编程_python_16

我们再分别调用a02变量和fun02()方法,如下:
python基础(part17)--函数式编程_lambda表达式_17

结果:
python基础(part17)--函数式编程_lambda表达式_18

③有返回值

代码:
python基础(part17)--函数式编程_赋值_19
我们再分别调用a03变量和fun03()方法,如下:
python基础(part17)--函数式编程_python_20
结果:
python基础(part17)--函数式编程_python_21

为什么要改写成lambda表达式?
原因就是,lambda表达式,没有名字(所以我们有时候也称其为匿名方法)它可以使我们的程序更加简洁;且,当我们只想把一个方法作为参数进行传递,但是不希望直接调用这个方法时(这个方法活着的价值就是传参),我们就可以用lambda表达式。

最后备注:如果我们看见一大段相似的代码,但是其中的计算方式(算法)不一样。我们就应该将算法提取出去(lambda表达式),将共性保留下来(保留成静态函数)。

内置高阶函数

高阶函数,即将函数作为参数或返回值的函数。
对于一些内置的高阶函数,在下面的笔记中,每一个内置高阶函数我都举个例子,大概就能明白了,不明白,请自行看文档/百度。

filter
  • 举个例子

先定义Enemy类和创建Enemy对象列表(这些class和列表在下面的内置高阶函数的例子中也会用到):

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

过滤:
python基础(part17)--函数式编程_高阶函数_23

结果:
python基础(part17)--函数式编程_lambda_24

map
  • 举个例子

映射:

python基础(part17)--函数式编程_lambda_25
结果:
python基础(part17)--函数式编程_赋值_26

sorted
  • 举个例子

①降序排序(需要用变量接收返回值)
python基础(part17)--函数式编程_lambda表达式_27
结果:
python基础(part17)--函数式编程_赋值_28

②升序排序(需要用变量接收返回值)

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

结果:
python基础(part17)--函数式编程_赋值_30

max
  • 举个例子

最大值:
python基础(part17)--函数式编程_lambda表达式_31

结果:
python基础(part17)--函数式编程_高阶函数_32

函数作为返回值

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

上一篇:python基础(part12)--模块
下一篇:没有了
网友评论