目录
14.4.1 理解匿名函数
14.4.2 lambda表达式
14.4.3 lambda表达式与具名函数
14.4.4 知识要点
14.4.5 系统学习python
14.4.1 理解匿名函数
匿名函数,从其字面意思来进行理解。所谓的匿名即不具名,没有名称。匿名函数,也就是没有函数名的函数。
在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 系统学习python
薯条老师简介:资深技术专家,技术作家,著有《Python零基础入门指南》,《Java零基础入门指南》等技术教程。薯条老师的博客:http://www.chipscoco.com, 系统学习后端,爬虫,数据分析,机器学习、量化投资。