# 11|装饰器、闭包与 lambda 表达式
很多人在学 Python 的过程中,一看到“装饰器”这三个字就开始紧张。
因为它看起来像这样:
@xxxdeffunc():...表面上好像很酷,实际上第一次看到的人往往会问:
- 这个
@到底是什么? - 为什么函数上面还能写东西?
- 闭包和装饰器是什么关系?
lambda又是拿来干嘛的?
这篇文章就专门把这三个容易混在一起的概念讲清楚:
lambda表达式- 闭包
- 装饰器
它们并不是三个完全孤立的知识点,而是一条逐渐递进的学习链路。
一、先从最轻的开始:lambda
lambda是一种创建匿名函数的写法。
最常见的普通函数写法:
defadd(x,y):returnx+y用lambda可以写成:
add=lambdax,y:x+yprint(add(2,3))输出:
5你可以把它理解成:
用一行代码定义一个很简单的小函数。
二、lambda适合什么场景
lambda并不是为了替代所有函数。
它更适合:
- 函数逻辑很简单
- 只会临时使用一次
- 作为参数传给别的函数
例如排序:
students=[{"name":"小林","score":88},{"name":"小王","score":95},{"name":"小张","score":76}]students.sort(key=lambdaitem:item["score"],reverse=True)print(students)这里的lambda item: item["score"]表示:
“每个元素按照它的score值参与排序”。
如果不用lambda,你还得额外写一个函数,反而更啰嗦。
三、什么时候不推荐用lambda
如果逻辑已经稍微复杂一点,就不要硬塞进lambda。
例如下面这种不推荐:
func=lambdax:x*2ifx>10elsex+3ifx>5elsex-1虽然能写,但可读性很差。
更好的方式是正常定义函数:
defhandle_num