百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Python 匿名函数魔法手册:lambda(python匿名函数关键字)

itomcoil 2025-05-03 14:46 5 浏览

对话实录

小白:(抓狂)为什么同事的代码满屏都是lambda,看得我眼晕!

专家:(挥舞魔杖)lambda 是 Python 的魔法咒语,用对场景威力无穷

基础手册

1.函数定义

# 传统函数 vs lambda
def add(x, y): # 普通函数
 return x + y

add = lambda x, y: x + y # lambda版本

专家提醒:lambda 本质是表达式,适合简单逻辑!它的结构紧凑,当你需要一个简单的函数,且不想专门定义一个冗长的def函数时,lambda 就派上用场了。比如在一些临时的、仅使用一次的函数场景中,lambda 能让代码更简洁。

2. 应用场景

场景1:排序魔法

通过添加key=lambda的表达式 实现按照key值进行排序

students = [{"name":"小明","age":18}, {"name":"小红","age":16}]

#使用列表自带的sort函数、或者使用sorted函数 对列表进行排序
students.sort(key=lambda x: x["age"])  #按照age排序 正序
sorted(students,key=lambda x: x["age"],reverse=True)   #按照age排序 倒序

场景2:配合高阶函数map(),filter(),reduce()使用,这三个函数都是传入函数对象和可迭代对象作为参数。

1)map函数举例:

map(function, iterable),意思是function会对 iterable 的每一个元素作为入参执行计算后,并最终返回一个新的可迭代对象,而此处的function我们可以使用lambda表达式。

#通过map函数 返回经过平方计算后的结果
value1 = map(lambda x: x ** 2, [1, 2, 3, 4, 5])
#使用list()将可迭代对象转为列表
print(list(value1))
#结果
[1, 4, 9, 16, 25]

2)filter函数举例:

filter(function, iterable),意思是function会对 iterable 的每一个元素作为入参执行计算后,保留符合条件的元素,返回一个新的可迭代对象,而此处的function我们可以使用lambda表达式。

nums = [1,2,3,4,5]
#过滤偶数元素
even = list(filter(lambda x: x%2==0, nums))
#结果为[2,4]

reduce函数举例

from functools import reduce
product = reduce(lambda x,y: x*y, [1,2,3,4]) # → 24

functools模块中的reduce函数与 lambda 函数结合,可以对序列进行累积计算。在这个例子中,lambda 函数定义了累积的逻辑,即依次将序列中的元素相乘,最终得到整个序列的乘积。这种组合在处理需要对序列进行聚合操作的场景中非常有用。

六大高阶魔法

魔法 1:闭包捕获

def power_factory(n):
	return lambda x: x ** n

square = power_factory(2)
print(square(5)) # → 25


在这里,power_factory函数返回一个 lambda 函数,这个 lambda 函数捕获了外部函数power_factory的变量n。每次调用返回的 lambda 函数时,它会使用捕获的n值进行计算,就像拥有了自己的 “记忆”,能根据不同的n值生成特定幂次的函数。

魔法 2:立即执行

(lambda x: print(f"收到消息:{x}"))("重要通知!")

这是一种即时执行 lambda 函数的方式,不需要提前定义函数名。直接将 lambda 表达式包裹在括号内,并在后面紧跟参数,就可以立即执行这个匿名函数,非常适合一次性的、简单的操作,比如快速打印一条消息。

魔法 3:字典排序

data = {"苹果":3, "香蕉":1, "橙子":2}
sorted_items = sorted(data.items(), key=lambda x: x[1])

在对字典进行排序时,sorted函数的key参数接收一个 lambda 函数。这里的 lambda 函数以字典的键值对为输入,通过返回值x[1](value值)来指定按字典的值进行排序。这样就能轻松得到按值排序后的键值对列表。

魔法 4:嵌套 lambda

math_operation = lambda x: lambda y: x + y
add_five = math_operation(5)

print(add_five(3)) # → 8

通过嵌套 lambda 函数,可以创建一个更复杂的函数结构。外层 lambda 函数接收一个参数x,并返回一个内层 lambda 函数。内层 lambda 函数又接收一个参数y,并基于外层的x值进行计算。这种方式可以构建一些具有特定上下文的函数,比如这里的add_five就是一个固定加 5 的函数。

魔法 5:多参数 lambda

multi_calculation = lambda a, b, c: a * b + c
result = multi_calculation(2, 3, 4)
print(result) # → 10

lambda 函数并不局限于单参数,它可以接收多个参数。在这个例子中,multi_calculation是一个接收三个参数a、b、c的 lambda 函数,它按照特定的逻辑进行计算,展示了 lambda 在处理多参数场景下的灵活性。

魔法 6:结合三元表达式

is_positive = lambda num: "正数" if num > 0 else "非正数"
print(is_positive(5)) # → 正数
print(is_positive(-1)) # → 非正数

lambda 函数与三元表达式结合,能在简洁的代码中实现条件判断逻辑。is_positive函数根据输入的数字是否大于 0,返回不同的字符串,这种方式让代码既紧凑又清晰地表达了条件判断的意图。

四大血泪陷阱

变量捕获问题

funcs = [lambda x: x+i for i in range(3)]  
print(funcs[0](10)) # → 12 

# 正确做法:lambda x, i=i: x+i

在这个例子中,本意是创建三个不同的 lambda 函数,每个函数根据不同的i值进行计算。但由于 lambda 函数在运行时才捕获变量i的值,而循环结束后i的值为 2,所以所有函数都使用了i=2。正确的做法是通过默认参数i=i,在定义 lambda 函数时就固定i的值。

尝试写多行

# 错误示范!
lambda x:
 print(x)
 return x*2 #  SyntaxError

# 必须单行完成所有逻辑

lambda 函数的语法限制它必须在一行内完成所有逻辑。如果尝试在 lambda 函数内换行写多条语句,会导致语法错误。它的简洁性决定了它只适用于简单的、可以在一行内表达清楚的操作。

混淆参数与返回值

# 错误理解lambda结构
wrong_lambda = lambda x: x, 2*x # 本意是返回x和2*x,但实际返回一个元组

correct_lambda = lambda x: (x, 2*x) # 正确返回元组的方式

有时候会误解 lambda 函数的返回值结构。在wrong_lambda中,本意是返回x和2*x,但由于没有正确使用括号,实际上返回的是一个元组,其中第一个元素是x,第二个元素是2*x。正确的做法是使用括号将多个返回值包裹起来,如correct_lambda。

忽略类型兼容性

from typing import List
# 错误:lambda返回值类型与预期不符

nums: List[int] = list(map(lambda x: str(x), [1, 2, 3])) # 预期是int列表,实际返回str列表

当在代码中使用类型注解时,要注意 lambda 函数的返回值类型与预期是否一致。在这个例子中,nums被注解为List[int],但map结合的 lambda 函数返回的是字符串,这会导致类型不匹配,可能在后续代码中引发错误。在使用 lambda 函数时,要确保其输入和输出类型与整体代码的类型期望相兼容。

类型注解 lambda

from typing import Callable
adder: Callable[[int, int], int] = lambda x,y: x+y

通过类型注解,可以明确 lambda 函数的输入参数类型和返回值类型。这里adder被注解为接收两个int类型参数,返回一个int类型值的可调用对象,这有助于提高代码的可读性和可维护性,尤其是在大型项目中,能让其他开发者更清晰地理解 lambda 函数的功能

性能说明

# 传统函数 vs lambda速度测试
import timeit
print("lambda:", timeit.timeit(lambda: sum(range(1000))))
print("def函数:", timeit.timeit('sum(range(1000))'))
lambda: 15.674001800012775
def函数: 15.569343500013929

测试结果:两者性能几乎相同,选择依据应是可读性而非性能。在 Python 中,lambda 函数和普通的def定义的函数在执行效率上差别极小。所以在实际编程中,应优先考虑代码的可读性和可维护性来决定是否使用 lambda 函数,而不是单纯基于性能因素。

小白:(献上膝盖)原来 lambda 这么强大!

专家:(扶起小白)记住:lambda 是调味料,可别当主菜用!

相关推荐

PS小技巧 调整命令,让人物肤色变得更加白皙 #后期修图

我们来看一下如何去将人物的皮肤变得更加的白皙。·首先选中图层,Ctrl键加J键复制一层。·打开这里的属性面板,选择快速操作删除背景,这样就会将人物进行单独的抠取。·接下来在上方去添加一个黑白调整图层,...

把人物肤色提亮的方法和技巧

PS后期调白肤色提亮照片的方法。一白遮百丑,所以对于Photoshop后期来说把人物肤色调白是一项非常重要的任务。就拿这张素材图片来说,这张素材图片人脸的肤色主要偏红、偏黄,也不够白皙,该怎样对它进行...

《Photoshop教程》把美女图片调成清爽色彩及润肤技巧

关注PS精品教程,每天不断更新~~室内人物图片一般会偏暗,人物脸部、肤色及背景会出现一些杂点。处理之前需要认真的给人物磨皮及美白,然后再整体润色。最终效果原图一、用修补工具及图章工具简单去除大一点的黑...

PS后期对皮肤进行美白的技巧

PS后期进行皮肤美白的技巧。PS后期对皮肤进行美白的技巧:·打开素材图片之后直接复制原图。·接下来直接点击上方的图像,选择应用图像命令。·在通道这里直接选择红通道,混合这里直接选择柔光,然后点击确定。...

493 [PS调色]调模特通透肤色

效果对比:效果图吧:1、光位图:2、拍摄参数:·快门:160;光圈:8;ISO:1003、步骤分解图:用曲线调整图层调出基本色调。用可选颜色调整图层调整红色、黄色、白色和灰色4种颜色的混合比例。用色彩...

先选肤色再涂面部,卡戴珊的摄影师透露:为明星拍完照后怎么修图

据英国媒体12月17日报道,真人秀明星金·卡戴珊终于承认,她把女儿小北P进了家族的圣诞贺卡,怪不得粉丝们都表示这张贺卡照得非常失败。上周,这位39岁的女星遭到了一些粉丝针对这张照片的批评,她于当地时间...

如何在PS中运用曲线复制另一张照片的色调

怎样把另一张作品的外观感觉,套用到自己的照片上?单靠肉眼来猜,可能很不容易,而来自BenSecret的教学,关键是在PS使用了两个工具,让你可以准确比较两张照片的曝光、色调与饱和度,方便你调整及复制...

PS在LAB模式下调出水嫩肤色的美女

本PS教程主要使用Photoshop使用LAB模式调出水嫩肤色的美女,教程调色比较独特。作者比较注重图片高光部分的颜色,增加质感及肤色调红润等都是在高光区域完成。尤其在Lab模式下,用高光选区调色后图...

在Photoshop图像后期处理中如何将人物皮肤处理得白皙通透

我们在人像后期处理中,需要将人物皮肤处理的白皙通透,处理方法很多,大多数都喜欢使用曲线、磨皮等进行调整,可以达到亮但是不透,最终效果往往不是很好,今天就教大家一种如何将任务皮肤处理得白皙通透,希望能帮...

PS调色自学教程:宝宝照片快速调通透,简单实用!

PS调色自学教程:宝宝照片快速调通透。·首先复制图层,然后选择进入ACR滤镜,选择曲线锁定照片的亮部,也就高光位置,其他部位补亮一点,尤其是阴影的部位补亮多一些,让画面的层次均匀一点。·然后回到基本项...

【干货】如何利用PS进行人物美化

人物图像美化在Photoshop中非常常用,Photoshop作为一款功能强大的图像处理软件,不仅可以对人像进行基本的调色、美化和修复等处理,还可以改变人物的线条和幅度,如调整脸部器官和脸型的大小、调...

教大家一种可以快速把肤色处理均匀的方法@抖音短视频

快速把肤色处理均匀的方法。今天教大家一种可以快速把肤色处理均匀的方法。像这张照片整体肤色走紫红色,但是局部偏黄缘处理起来非常的麻烦。其实我们只需要新建空白图层,图层混合模式更改为颜色,再选择画笔工具把...

PS调色教程 利用RAW调出干净通透的肤色

要么不发,要么干货。后期教程来噜~用RAW调出干净通透的肤色。这次终于不会原片比PS后好看了吧。如果你依然这么觉得,请不要残忍的告诉我这个事实,泪谢TAT)附送拍摄花絮,感谢各位的支持更多风格请关注m...

photoshop后期皮肤变白的技巧

PS后期皮肤变白的技巧。1.PS后期让皮肤变白的方法有很多种,接下来教你一种非常简单容易上手的方法。2.打开素材图片之后,直接在小太极下拉框的位置添加一个纯色调整图层,颜色设置一个纯白色,点击...

Photoshop调出人物的淡雅粉嫩肤色教程

本教程主要使用Photoshop调出人物的淡雅粉嫩肤色教程,最终的效果非常的通透迷人,下面让我们一起来学习.出自:86ps效果图:原图:1、打开原图复制一层。2、用Topaz滤镜磨皮(点此下载)。3、...