(二十)python 3 匿名函数

匿名函数lambda

Python使用lambda关键字创造匿名函数。所谓匿名,意即不再使用def语句这样标准的形式定义一个函数。这种语句的目的是由于性能的原因,在调用时绕过函数的栈分配。其语法是:

lambda [arg1[, arg2, ... argN]]: expression

其中,参数是可选的,如果使用参数的话,参数通常也会在表达式之中出现。

无参数
# 使用def定义函数的方法
def true():
  return True

#等价的lambda表达式
>>> lambda :True
<function <lambda> at 0x0000000001E42518>

# 保留lambda对象到变量中,以便随时调用
>>> true = lambda :True
>>> true()
True
一个参数 
# 使用def定义的函数
def add( x, y ):
  return x + y

# 使用lambda的表达式
lambda x, y: x + y

# lambda也允许有默认值和使用变长参数
lambda x, y = 2: x + y
lambda *z: z

# 调用lambda函数
>>> a = lambda x, y: x + y
>>> a( 1, 3 )
4
>>> b = lambda x, y = 2: x + y
>>> b( 1 )
3
>>> b( 1, 3 )
4
>>> c = lambda *z: z
>>> c( 10, ‘test‘)
(10, ‘test‘)

lambda是单个的表达式,不是一个代码块 lambda的设计是为了满足简单函数的场景,仅能封装有限的逻辑,有复杂逻辑的情况有def来处理,所以lambda的功能要比def小的多  

lambda表达式是可以嵌套的(闭包)

>>> action = (lambda x : (lambda y : x + y))
>>> a = action(10)
>>> a(5)
15

匿名函数的使用  

匿名函数通常被用作高阶函数(higher-order function,参数为函数的函数)的参数。比如,几个内置函数:filter(),map(),reduce()。下面我们分别看看这几个函数的用法及达到相同效果的python另一种特征的用法

filter函数

>>> list = [1, 2, 3]
>>> result = filter(lambda x: x%2==0, list)
>>> result
[2]
>>> result = [x for x in list if x%2==0]
>>> result
[2]

map函数

>>> result = map(lambda x: x*2, list)
>>> result
[2, 4, 6]
>>> result = [x*2 for x in list]
>>> result
[2, 4, 6]

reduce函数

>>> result = reduce(lambda x, y: x+y,list)
>>> result
6
>>> result = sum(list)
>>> result
6

跳转表(jump table) 

lambda的另一种用法是用来编写跳转表,也就是行为列表或字典,能按需执行特定的动作。

>>> key = "get"
>>> {"abc":(lambda : 2 + 2),"bcd" : (lambda : 3 + 3), "get" : (lambda : 4 + 4)}

[key]()
8

  

注意问题:

x = 10
a = lambda y: y + x

x = 20
b = lambda y: y + x

#猜想一下:a(10) 和 b(10)返回的结果是什么?如果你认为结果是20 和 30,那么就错了

print(a(10))  ##输出:30

print(b(10))  ##输出:30

lambda表达式中的x是一个自由变量, 是在运行时绑定值,而不是定义时就绑定,即lambda表达式中的x是执行时的值,这与函数的默认值参数定义是不同的。例如:

x = 15
print(a(10))  ##输出:25

x = 3
print(a(10)) ##输出:13

如果想让匿名函数,在定义时就捕获到参数值,可以将那个参数值定义成默认参数即可,例如:

m = 4
c = lambda n, m = m: m + n

print(c(10))  ##输出:14

m = 2
print(c(10))  ##输出:14

  

有时候,可能会不恰当的使用lambda表达式。 比如,通过在一个循环或列表推导中创建一个lambda表达式列表,并期望函数能在定义时就记住每次的迭代值。例如:

funcs = [lambda x: x+n for n in range(3)]
for f in funcs:
    print(f(0))

# 2
# 2
# 2

但是实际效果是,n的值为迭代的最后一个值。将参数值设置为默认参数,才能得到想要的效果,修改代码如下:

funcs = [lambda x, n = n: x+n for n in range(3)]
for f in funcs:
    print(f(0))

# 0
# 1
# 2

  

原文地址:https://www.cnblogs.com/a-ant/p/11030145.html

时间: 2024-10-03 01:26:04

(二十)python 3 匿名函数的相关文章

python 之匿名函数

当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数: >>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])) [1, 4, 9, 16, 25, 36, 49, 64, 81] 通过对比可以看出,匿名函数lambda x: x * x实际上就是: def

【C语言天天练(二十)】scanf函数详解

引言:scanf函数虽然是学习C语言时比较早就接触的一个函数,但在使用过程中,发现真正掌握它却并不容易.本文就通过各种例子来详细的总结一下该函数的各种用法,假设它的调用格式为 scanf("<格式化字符串>",<地址表>). 1.一般使用scanf函数时都是为某个变量赋值,不考虑它的返回值.但是任何函数都是需要返回的(即使返回类型用void,也可以认为只是调用了return语句,只是并没有返回什么东西而已),同样的scanf函数也是有返回的,它的返回值是成功读取

python基础——匿名函数及递归函数

python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x表示函数参数. 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果. 2 匿名函数举例 用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突.此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数: >>> f = lam

小学生都能学会的python(&lt;lamda匿名函数,sorted(),filter(),map(),递归函数&gt;)

小学生都能学会的python(<<lamda匿名函数,sorted(),filter(),map(),递归函数,二分法>> 1. lambda 匿名函数 lambda 参数: 返回值 注意: 1. 函数的参数可以有多个. 多个参数之间?逗号隔开2. 匿名函数不管多复杂. 只能写??, 且逻辑结束后直接返回数据3. 返回值和正常的函数?样, 可以是任意数据类型 # def fang(x): # return x**2 # # # ret = fang(5) # # print(ret

python进阶一(函数式编程)【2-7 python中匿名函数】

python中匿名函数 高阶函数可以接收函数做参数,有些时候,我们不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算 f(x)=x2 时,除了定义一个f(x)的函数外,还可以直接传入匿名函数: 1 >>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])#lambda x 就是定义的一个函数, x * x就是直接传入的函数 2 [1, 4, 9, 16, 25, 36

python基础-匿名函数、内置函数、正则表达式、模块

1. 匿名函数 1.1 有名函数 有名函数:定义了一个函数名,函数名指向内存地址:通过函数名进行访问.函数名加括号就可以运行有名函数,例如:func() def func(x, y, z = 1): return x + y + z print(func(1,5,2)) 1.2 匿名函数 匿名函数:没有名字的函数,定义的时候不需要函数名:定义匿名函数的关键字是:lambda 特点: 1.没有函数名 2.函数自带return 应用场景: 1.应用于一次性的地方 2.临时使用 salaries={

【Python之匿名函数及递归】

一.匿名函数及内置函数补充 1.语法 Python使用lambda关键字创造匿名函数.所谓匿名,意即不再使用def语句这样标准的形式定义一个函数. 语法: lambda [arg1[, arg2, ... argN]]: expression 例: 普通函数 def func(x,y): return x+y print(func) print(func(1,2)) 输出 <function func at 0x102b31f28> 3 等价的匿名函数 #匿名函数 f=lambda x,y:x

【Python 生成器 匿名函数 递归 模块及包的导入 正则re】

一.生成器 1.定义 生成器(generator)是一个特殊的迭代器,它的实现更简单优雅,yield是生成器实现__next__()方法的关键.它作为生成器执行的暂停恢复点,可以对yield表达式进行赋值,也可以将yield表达式的值返回. 也就是说,yield是一个语法糖,内部实现支持了迭代器协议,同时yield内部是一个状态机,维护着挂起和继续的状态. yield的功能: 1.相当于为函数封装好__iter__和__next__ 2.return只能返回一次值,函数就终止了,而yield能返

python中匿名函数lambda如何用

python中经常用到的一个函数:匿名函数lambda ,什么是匿名函数?匿名函数的意义是什么?匿名函数怎么样用?(疑问三连,what,why,how) 一,什么是匿名函数? python中没有名字的函数,称为匿名函数.语法格式:lambda  x : x**2  既 lambda+形参:代码块 二,匿名函数的意义是什么? 一是它没有名字,所以不会引起命名冲突,二是它格式简单,代码块直接return返回值,比较灵活方便,而且因为没有名字,用完就丢弃了,不占内存. 三,匿名函数怎么用? 这个得举例