Python 中的 lambda 函数

Python 中的 lambda 函数

1. 为什么使用 lambda 函数

# 常规函数的定义
def sq(x):
    return x*x

map(sq, [y for y in range(10)])

# 使用 lambda 函数
map(lambda x:x**2, [y for y in range(10)])

从以上代码可以看出,使用 lambda 函数减少了代码的冗余,另外,使用 lambda(匿名函数) ,对于使用次数很少的函数,不需要费神地对函数进行命名,可以快速实现某项功能,最后,lambda 函数使代码地可读性更强,程序看起来更简洁

lambda 函数语法

lambda argument_list:expression

argument_list: 参数列表	同 Python 中 function 中函数的参数列表一样
a
a, b
*args
**kwargs
a, b = 1, args
None
...

expression: 表达式 表达式中出现的参数都需要在 argument_list 中有定义,并且 表达式只能是单行的
1
None
a + b
sum(a)
1 if a >10 else 0
...

既然使用 lambda 函数可以减少代码的冗余,那 lambda 函数在一定程度上是否可以提高代码的效率呢?

我们做个测试

import time

# 测试的Def函数
def square1(n):
    return n ** 2

# 测试的Lambda函数
square2 = lambda n: n ** 2

time_begin = time.time()
print(time_begin)
# 使用Def函数
i = 0
while i < 1000000000:
    square1(100)
    i += 1

time_stop1 = time.time()
print(time_stop1)

# 使用lambda函数
i = 0
while i < 1000000000:
    square2(100)
    i += 1

time_stop2 = time.time()
print(time_stop2)
print(time_stop1 - time_begin)
print(time_stop2 - time_stop1)
if (time_stop2 - time_stop1) > (time_stop1 - time_begin):
    print('lambda 函数没有提高代码的运行效率反而使代码运行速度变慢')
else:
    print('lambda 函数在迭代次数很大时(10亿次)时可以看到明显的效率提高')
    
# 1618471673.8691976
# 1618472146.0701563
# 1618472594.563975
# 472.2009587287903
# 448.4938187599182
#lambda 函数在迭代次数很大时(10亿次)时可以看到明显的效率提高

2. lambda 函数的用处

1)直接将函数赋给变量

然后像一般的函数那样使用(即类似于 def 模式的简化版)

a = lambda x, y, z:x*y*z
a(2, 3, 4)

# 24

直接传参

a = (lambda x:x**2)(3)
print(a)

# 9

2)将 lambda 函数作为参数传递给 python 一些内置函数使用

filter 结合使用
a = filter(lambda x:x%3 = 0,[1, 2, 3, 4, 5, 6])
print(list(a))	# filter 类型的参数需要使用 list() 方法来转换

# [3, 6]
map 结合使用
squares = map(lambda x:x**2, range(5))
print(list(squares))	# map 类型的参数需要使用 list() 方法来转换

# [0,1,4,9,16]
sorted 结合使用
a = [('b',3),('a',2),('d',1),('c',4)]

sorted(a,key=lambda x:x[0])
# [('a',2),('b',3),('c',4),('d',1)]
reduce 结合使用
from functools import reduce
print(reduce(lambda a,b:'{},{}'.format(a,b),[1,2,3,4,5,6,7,8,9]))

1,2,3,4,5,6,7,8,9

3)将 lambda 函数嵌入到一般的函数中,作为返回值返回

def increment(n):
    return lambda x:x+n

f = increment(4)
f(2)

# 相较一般的函数定义 类似的是将两个参数分开来定义

4)在串联字符串时也可以使用 lambda 函数

x = (lambda x='Boo', y='Too', z='Zoo': x+y+z)
print(x('Foo'))

# 'FooTooZoo'

※ 5)在 tkinter 库中定义内联的 callback 函数

import sys
from tkinter import Button
x = Button(text='Press me', command=(lambda :sys.stdout.write('Hello world\n')))
x.pack()
x.mainloop()

# 个人觉得 在'tkinter'中作为内联函数使用是'lambda'函数存在最大的作用
# 下面是作者个人使用到'lambda'函数解决的最大问题的方式
# (此处要插入链接)

6)判断字符串是否是以某个特定的字母开头

Names = ['Anne', 'Amy', 'Bob', 'David', 'Carrie', 'Barbara', 'Zach']
B_Name = filter(lambda x:x.startswith('B'), Names)
print(list(B_Name))

# ['Bob', 'Barbara']

7)求两个列表的元素和

a = [1,2,3,4]
b = [5,6,7,8]
print(list(map(lambda x,y:x+y, a,b)))

# [6,8,10,12]

8)求字符串每个单词的长度

sentence = "Welcome To Beijing!"
words = sentence.split()
lengths  = map(lambda x:len(x),words)
print(list(lengths))

# [7,2,8]
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值