注册 登录
Python基础教程

第一章: 环境搭建,安装Python

第二章: 挑选一款趁手的IDE

第三章: 计算机基础知识

第四章: 命令行基础知识

第五章: 从全局把握Python

第六章: Python语言基础

第七章: Python流程控制

第八章: Python数据类型与运算

第九章: Python字符串类型

第十章: Python列表类型

第十一章: Python元祖类型

第十二章: Python字典类型

第十三章: Python集合类型

第十四章: Python函数处理

第十五章: Python文件处理

第十六章: Python面向对象

第十七章: Python异常处理

第十八章: Python模块处理

第十九章: Python项目实战

首页 > Python基础教程 > 第十四章: Python函数处理 > 14.4节:匿名函数lambda表达式

14.4节:匿名函数lambda表达式

薯条老师 2020-05-22 07:44:04 206797 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师的线下Python,Java小班周末班已经开课了,培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Java后端开发。授课详情请点击:http://chipscoco.com/?cate=6

14.4.1 理解匿名函数

匿名函数,从其字面意思来进行理解。所谓的匿名即不具名,没有名称。匿名函数,也就是没有函数名的函数。

image.png

在Python中,通过lambda表达式来定义匿名函数。

14.4.2 lambda表达式

关于lambda表达式,可以在交互模式中执行help("lambda")来查看其定义 :
>>> help("lambda")
Lambdas
*******
  lambda_expr        ::= "lambda" [parameter_list] ":" expression
  lambda_expr_nocond ::= "lambda" [parameter_list] ":" expression_nocond
Lambda expressions (sometimes called lambda forms) are used to create
anonymous functions. The expression "lambda parameters: expression"
yields a function object.  The unnamed object behaves like a function
object defined with:
  def <lambda>(parameters):
      return expression
See section Function definitions for the syntax of parameter lists.
Note that functions created with lambda expressions cannot contain
statements or annotations.
Related help topics: FUNCTIONS
从help("lambda")的输出,我们可以知道lambda表达式用来创建匿名函数:
Lambda expressions (sometimes called lambda forms) are used to create anonymous functions.
lambda表达式的语法结构:
lambda parameters: expression
parameters表示函数的形参列表,参数以逗号进行分隔,形参列表与具名函数一样,可以为空。expression表示你要实现的表达式的代码逻辑,表达式的值会直接返回给函数调用方,无需通过return进行返回。
具名函数即为有函数名的函数。通过def来定义的函数,就叫具名函数。

为便于同学们对匿名函数进行理解,现在分别使用具名函数,匿名函数来编写一段相同逻辑的代码:

# __desc__ = 使用具名函数和匿名函数来编写一段相同逻辑的代码
 
# 1. 定义具名函数accumulate,将参数进行累加
def accumulate(small, large):
 return small + large
 
x = 1
y = 2
 
z = accumulate(x, y)
# z的输出为3
 
 
# 2. 定义匿名函数,将参数进行累加
# 由于是匿名函数,所以不能直接调用该匿名函数,需要将匿名函数保存到一个变量中,
# 再进行调用
 
anonymous_accumulate = lambda x, y:x+y
 
# 通过变量来调用匿名函数时,与具名函数的调用方式一样
z = anonymous_accumulate(x, y)
# z的输出为3
在上文代码中定义了一个匿名函数,然后将其赋值到变量anonymous_accumulate中。Python中的变量,是一个存储内存地址的容器,变量anonymous_accumulate实际保存的是匿名函数的内存地址。Python在执行匿名函数时,先从变量中取出匿名函数的内存地址,然后再进行调用。

14.4.3  lambda表达式与具名函数

lambda表达式与具名函数相比,在形式上更加简单,只需一行代码就能搞定。但也同时限制了lambda表达式不能实现复杂的代码逻辑。如要实现复杂的代码逻辑,还应当使用具名函数。lambda表达式使用起来很灵活,可以作为参数传递,作为返回值来传回给调用方,也可以直接嵌入到其它数据结构中。
(1) 使用lambda表达式作为参数的默认值
代码实例:
# __desc__ = 使用lambda表达式作为默认参数
 
# 1. 定义具名函数accumulate,将参数进行累加
def accumulate(small, large, add_weight=lambda x:x+1):
    """参数add_weight的默认值为一个匿名函数"""
    small = add_weight(small)
    return small + large
 
x = 1
y = 1
z = accumulate(1,2)
# z的输出为4
如果使用具名函数的话,就没有这样的灵活性。当然我们在调用的时候,也可以直接将具名函数作为参数进行传递:
# __desc__ = 使用lambda表达式作为默认参数
 
# 1. 定义具名函数accumulate,将参数进行累加
def accumulate(small, large, add_weight=lambda x:x+1):
    """参数add_weight的默认值为一个匿名函数"""
    small = add_weight(small)
    return small + large
 
# 使用def定义一个加权函数
def add_weight(x):
    return x+1
 
x = 1
y = 1
 
# 将具名函数add_weight作为参数进行传递
z = accumulate(1,2, add_weight)
# z的输出同样为4
(2) 将lambda表达式嵌入到字典结构中
代码实例:
# __desc__ = 将lambda表达式嵌入到字典结构中
 
# 定义一个commands字典,表示各种命令
commands = {"add": lambda x,y:x+y, "sub": lambda x, y:x-y}
 
x = 1
y = 2
 
# 1.执行加法运算
z = commands["add"](x,y)
# z的输出为3
 
# 2.执行减法运算
z = commands["sub"](x,y)
# z的输出为-1
(3) 将lambda表达式作为返回值
代码实例:
# __desc__ = 将lambda表达式作为值进行返回
 
# 在具名函数中返回lambda表达式
def get_accumulate_lambda(x,y):
    initial_value = 2020
    return lambda :x+y+initial_value
 
accumulate = get_accumulate_lambda(0,1)
z = accumulate()
# z的输出为2021
当然,也可以直接将具名函数作为返回值进行返回,但不如匿名函数这样简洁。
代码实例:
# __desc__ = 将lambda表达式作为值进行返回
 
# 在具名函数中返回lambda表达式
def get_accumulate(x,y):
    # 在函数中定义函数
    def accumulate():
        initial_value = 2020
        return x+y+initial_value
 
    # 定义的函数作为返回值进行返回
    return accumulate
 
accumulate = get_accumulate(0,1)
z = accumulate()
# z的输出为2021
上文的代码实例中,定义的accumulate其实是一个闭包函数。关于闭包函数,会在函数的高级用法中进行详细讲解。

14.4.4 知识要点

(1) 匿名函数,即不具名,没有函数名的函数。
(2) 在Python中通过lambda表达式来定义匿名函数。使用匿名函数时,要先通过变量来保存匿名函数的地址。这样就可以在下文中进行调用。
(3) lambda表达式与具名函数相比,在形式上更加简单,只需一行代码。

14.4.5 高薪就业班

(1) Python后端工程师高薪就业班,月薪10K-15K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,免费领取课程大纲
(3) Java后端开发工程师高薪就业班,月薪10K-20K, 免费领取课程大纲
(4) Python大数据工程师就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取学习资料:


欢迎 发表评论:

请登录

忘记密码我要注册

注册账号

已有账号?请登录