为了解决那些功能很简单的需求而设计的一句话函数
例1:
def calc(n):
return n ** n
print(calc(10)
# 换成匿名函数
calc = lambda n: n ** n
print(calc(10)
例2:
l=[3,2,100,999,213,1111,31121,333]
print(max(l))
dic={'k1':10,'k2':100,'k3':30}
print(max(dic))
print(dic[max(dic, key=lambda k: dic[k])]) # 返回的是冒号后面的内容
>
31121
k3
100
例3:
l1 = [2, 3, 8, 4, 9]
print(list(filter(lambda x: x >3, l1))) # 如果需要两种返回值,必须要三元表达式,
# map映射的意思就一定要一一对应,给了几个值就必须返回对等数量的值。
##效果相当于:
def f(x):
if x > 3:
return x + 1
else:
return x ** 2
print(list(map(f, l1)))
[4, 9, 8, 4, 9]
[4, 9, 9, 5, 10]
例4:
l1 = [1,2,3,4,5,6]
l2 = ['laura', 'wendy', 'tidk', 'lidkj', 'dkhn']
l3 = ('**','***','****','*******')
print(list(filter(lambda x: x[0] > 2 and len(x[2]) > = 4, zip(l1, l2, l3)))) # 可以用and
例5
v = [lambda :x + 1 for x in range(5)] # 列表里的range已经执行完了,变量x已经从0变成了9。
print(v[0])
print(v[1]())
### 以上 v 等价于:
v1 = []
def lambda1():
for x in range(5):
x += 1
v1.append(lambda1)
return x + 1
print(lambda1())
print(v1)
>
6
[<function lambda1 at 0x000001F2A675C1E0>, <function lambda1 at 0x000001F2A675C1E0>, <function lambda1 at 0x000001F2A675C1E0>, <function lambda1 at 0x000001F2A675C1E0>, <function lambda1 at 0x000001F2A675C1E0>]
例6
v = (lambda :x for x in range(10)) # 迭代器生成器 genetator
print(v)
print(v[0])
print(v[0]()) # 迭代器没有索引值
print(next(v)) # 迭代器只能用next机制取值,next一下,才执行下一次
print(next(v)())
>
<generator object <genexpr> at 0x000001EE3871F6D8> # 迭代器的地址
<function <genexpr>.<lambda> at 0x000001EE36ADC1E0> # 用next取出的第一个生成器中的函数地址
1 # 加了括号就成了函数执行体。执行第二个地址,因为前一个已经被取出。