blog/docs/code/python/lambda.md

199 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 匿名函数 lambda
date: 2020-09-20 13:25:10
tags: [Python]
categories: [Python]
author: Anges黎梦
---
### 匿名函数 lambda
> 匿名函数 是指一类无需定义标识符(函数名)的函数或子程序。
>
>lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。
- lambda只是一个表达式函数体比def简单很多。
- lambda的主体是一个表达式而不是一个代码块。
- 仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda函数拥有自己的命名空间且不能访问自有参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
**说明**一定非要使用lambda函数任何能够使用它们的地方都可以定义一个单独的普通函数来进行替换。我将它们用在需要封装特殊的、非重用代码上避免令我的代码充斥着大量单行函数。
### 语法
` lambda argument_list: expression`
#### argument_list
argument_list 是参数列表,它的结构与 Python 中函数(function)的参数列表是一样的。
具体来说argument_list 可以有非常多的形式,例如:
- a, b
- a=1, b=2
- *args
- **kwargs
- a, b=1, *args
-
- ......
#### expression
expression 是一个关于参数的表达式。
表达式中出现的参数需要在 argument_list 中有定义,并且表达式只能是单行的。
以下都是合法的表达式:
- 1
- None
- a + b
- sum(a)
- 1 if a >10 else 0
- ......
#### 其他
lambda argument_list: expression表示的是一个函数。这个函数叫做lambda函数。
### 特性
lambda函数有如下特性
- lambda函数是匿名的所谓匿名函数通俗地说就是没有名字的函数。lambda函数没有名字。
- lambda函数有输入和输出输入是传入到参数列表argument_list的值输出是根据表达式expression计算得到的值。
- lambda函数一般功能简单单行expression决定了lambda函数不可能完成复杂的逻辑只能完成非常简单的功能。由于其实现的功能一目了然甚至不需要专门的名字来说明。
下面是一些lambda函数示例
```python
lambda x, y: x*y# 函数输入是x和y输出是它们的积x*y
lambda:None# 函数没有输入参数输出是None
lambda *args: sum(args); # 输入是任意个数的参数,输出是它们的和(隐性要求是输入参数必须能够进行加法运算)
lambda **kwargs: 1# 输入是任意键值对参数输出是1
```
### 用法
#### 变量赋值
直接赋给一个变量然后再像一般函数那样调用
```python
c=lambda x,y,z:x*y*z
c(2,3,4)
24
```
当然,也可以在函数后面直接传递实参
```python
(lambda x:x**2)(3)
9
```
#### 内置函数结合使用
将lambda函数作为参数传递给其他函数比如说结合map、filter、sorted、reduce等一些Python内置函数使用下面举例说明。
```python
fliter(lambda x:x%3==0,[1,2,3,4,5,6])
[3,6]
squares = map(lambda x:x**2,range(5)
print(lsit(squares))
[0,1,4,9,16]
```
与sorted函数结合使用比如创建由元组构成的列表
```python
a=[('b',3),('a',2),('d',4),('c',1)]
```
按照第一个元素排序
```python
sorted(a,key=lambda x:x[0])
[('a',2),('b',3),('c',1),('d',4)]
```
按照第二个元素排序
```python
sorted(a,key=lambda x:x[1])
[('c',1),('a',2),('b',3),('d',4)]
```
与reduce函数结合使用
```python
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
```
#### 函数嵌套
嵌套使用将lambda函数嵌套到普通函数中lambda函数本身做为return的值
```python
def increment(n):
return lambda x:x+n
f=increment(4)
f(2)
6
```
#### 字符串联合
有默认值也可以用x=(lambda...)这种格式
```python
x=(lambda x='Boo',y='Too',z='Z00'x+y+z)
print(x('Foo'))
'FooTooZoo'
```
#### 在tkinter中定义内联的callback函数
```python
import sys
from tkinter import Button,mainloop
x=Button(text='Press me',command=(lambda :sys.stdout.write('Hello,World\n')))
x.pack()
x.mainloop()
```
这段代码还是挺有意思的,希望小伙伴们可以复制粘贴运行一下哈。
#### 判断字符串是否以某个字母开头
```python
Names = ['Anne', 'Amy', 'Bob', 'David', 'Carrie', 'Barbara', 'Zach']
B_Name= filter(lambda x: x.startswith('B'),Names)
print(B_Name)
['Bob', 'Barbara']
```
#### 求两个列表元素的和
```python
a = [1,2,3,4]
b = [5,6,7,8]
print(list(map(lambda x,y:x+y, a,b)))
[6,8,10,12]
```
#### 求字符串每个单词的长度
```python
sentence = "Welcome To Beijing!"
words = sentence.split()
lengths = map(lambda x:len(x),words)
print(list(lengths))
[7,2,8]
```