网易首页 > 网易号 > 正文 申请入驻

Python:lambda 在高阶函数中的应用

0
分享至

lambda 是 Python 中用于创建匿名函数的语法,常与高阶函数配合使用,从而写出紧凑、表达力强的代码。典型应用场景包括:数据映射、条件过滤、归约操作、自定义排序、动态函数生成等。

一、lambda 与高阶函数

在 Python 中,高阶函数(Higher-Order Function)是指至少满足以下两点之一的函数:

(1)接受一个或多个函数作为参数。

(2)返回一个函数作为结果。

由于 lambda 本质上是一个函数对象,自然可以作为高阶函数的参数或返回值。

1、lambda 作为函数的参数

示例 1:作为普通函数的参数

def apply_twice(func, x):
    return func(func(x))

print(apply_twice(lambda x: x + 1, 3))
# 输出: 5   (3 先加 1 得 4,再加 1 得 5)

示例 2:嵌套 lambda(返回函数的函数)

adder = lambda x: lambda y: x + y
add5 = adder(5)
print(add5(3))  
# 输出: 8   (先固定 x=5,得到一个新函数,再传入 y=3)

提示:

当逻辑简单、一次性使用时可用 lambda;若逻辑复杂,优先 def 定义函数。

2、lambda 作为函数的返回值

示例:构造加法器

# make_adder 返回一个新函数
def make_adder(n):
    return lambda x: x + n

add5 = make_adder(5)
print(add5(3))  # 输出: 8
# 这里的 lambda 引用了外层参数 n,形成闭包

这里的 lambda 引用了外层函数的参数 n,形成了一个带记忆功能的函数()。

提示:

闭包场景下 lambda 能快速生成带状态的函数,但若函数需要复用,应命名并写注释。

二、lambda 在高阶函数的应用

1、元素逐个映射

将函数 func 作用于可迭代对象中的每个元素,返回一个新迭代器。

示例 1:将字符串列表转为长度列表

names = ["Alice", "Bob", "Clara"]
lengths = list(map(lambda s: len(s), names))
print(lengths)    # 输出: [5, 3, 5]

示例 2:逐元素相加(以较短序列为准)

a, b = [1, 2, 3], [10, 20, 30, 40]
sums = list(map(lambda x, y: x + y, a, b))
print(sums)    # 输出: [11, 22, 33]

提示:

能用列表/生成器推导式时优先使用推导式,提升可读性。

2、条件过滤

会保留所有 func(x) 为 True 的元素。

示例:过滤出偶数

nums = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens)    # 输出: [2, 4, 6]

类似功能推荐使用。

evens2 = [x for x in nums if x % 2 == 0]

提示:

用推导式 [...] if ... 更直观,filter 适合与已有函数搭配使用。

3、累积归约

会将函数 func 依次作用于序列元素,最终归约成一个值。

示例:累乘

from functools import reduce

# 将序列 [2, 3, 4] 累乘,初始值为 1
product = reduce(lambda acc, x: acc * x, [2, 3, 4], 1)
print(product)  # 24

这里的 acc 表示累计结果,每一步会被传入下一次计算。

更推荐使用内置函数:

import math
print(math.prod([2, 3, 4]))  # 输出: 24

提示:

能用 、 时尽量不用 reduce,除非逻辑确实需要自定义归约。

4、自定义排序

通过 key 指定排序逻辑。

示例:按分数排序

students = [
    {"name": "Alice", "score": 85},
    {"name": "Bob",   "score": 72},
    {"name": "Clara", "score": 91},
]

# 按成绩排序(升序)
sorted_students = sorted(students, key=lambda s: s["score"])
print(sorted_students)
# [{'name': 'Bob', 'score': 72}, {'name': 'Alice', 'score': 85}, {'name': 'Clara', 'score': 91}]

对比 operator.itemgetter:

from operator import itemgetter
print(sorted(students, key=itemgetter("score")))

提示:

简单字段排序用 itemgetter 更直观,多条件排序用 lambda。

5、选择最值

和 也支持 key 参数。

示例:找到成绩最高和最低的学生。

# 找到成绩最高和最低的学生
best = max(students, key=lambda s: s["score"])
worst = min(students, key=lambda s: s["score"])

print(best)   # {'name': 'Clara', 'score': 91}
print(worst)  # {'name': 'Bob', 'score': 72}

6、动态函数生成

可用 lambda 或 partial 动态返回函数。

示例 1:用 lambda 定义简单平方函数

square1 = lambda x: x ** 2
print(square1(5))  # 输出: 25

示例 2:用 .partial 固定参数,得到一个“平方函数”

from functools import partial

power = lambda x, n: x ** n
square2 = partial(power, n=2)
print(square2(5))  # 25

三、进阶技巧与注意事项

1、闭包与状态保存

示例:返回一个带状态的乘法器

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

times3 = make_multiplier(3)
print(times3(10))  # 30

提示:

lambda + 可快速生成“定制函数”,适合轻量场景。

2、多关键字排序

示例:先按分数升序,再按年龄降序

students = [
    {"name": "Alice", "score": 85, "age": 20},
    {"name": "Bob",   "score": 85, "age": 22},
    {"name": "Clara", "score": 91, "age": 19},
]

ranked = sorted(students, key=lambda s: (s["score"], -s["age"]))
print(ranked)

提示:

用元组 (主键, 次键, …) 实现多条件排序,比写嵌套 if-else 更简洁。

3、循环中的延迟绑定陷阱

错误示例:所有 lambda 都捕获了同一个 i

funcs = [lambda: i for i in range(3)]
print([f() for f in funcs])  # [2, 2, 2]

正确示例:用默认参数捕获当前值

funcs = [lambda i=i: i for i in range(3)]
print([f() for f in funcs])  # [0, 1, 2]

提示:

循环中定义 lambda 时,用默认参数绑定当前值。

小结

lambda 表达式在高阶函数中的典型应用包括:

map():逐个元素映射

filter():条件过滤

reduce():累积归约

sorted():自定义排序

min() / max():条件选择

partial():函数生成

它让代码更紧凑、灵活,是 Python 函数式编程的重要一环。但在实际项目中,应结合可读性与可维护性,避免过度使用 lambda。

点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
定了!天津一知名医院搬迁!原址正在拆除

定了!天津一知名医院搬迁!原址正在拆除

天津人
2025-12-28 15:34:45
调查发现:若老年人突然不吸烟,不出半年,身体会出现这7大变化

调查发现:若老年人突然不吸烟,不出半年,身体会出现这7大变化

健康之光
2025-12-28 11:50:07
慰安妇韦绍兰,在屈辱中生下日军的儿子,儿子长大后:我是中国人

慰安妇韦绍兰,在屈辱中生下日军的儿子,儿子长大后:我是中国人

纪中百大事
2025-12-27 11:58:56
杨少华长子杨威,对儿子杨化然说:我去德云社演出,郭德纲给钱了

杨少华长子杨威,对儿子杨化然说:我去德云社演出,郭德纲给钱了

知法而形
2025-12-27 19:44:29
毛新宇携家人祭奠爷爷:17岁漂亮女儿正面照流出,一画面信息量大

毛新宇携家人祭奠爷爷:17岁漂亮女儿正面照流出,一画面信息量大

博士观察
2025-12-27 10:54:27
岳父生日请吃饭,我买单花了1600,第二天岳父在银行给我打电话

岳父生日请吃饭,我买单花了1600,第二天岳父在银行给我打电话

枫红染山径
2025-12-08 12:25:43
钱再多有啥用?70岁身价千亿的比尔盖茨,还是要为23岁女儿操碎心

钱再多有啥用?70岁身价千亿的比尔盖茨,还是要为23岁女儿操碎心

瓜汁橘长Dr
2025-12-27 14:39:12
喜讯!山东泰山又锁定一名韩国联赛中场王牌?曾是克雷桑队友

喜讯!山东泰山又锁定一名韩国联赛中场王牌?曾是克雷桑队友

罗掌柜体育
2025-12-28 09:38:55
我给母校捐了一栋楼,校庆名单却没有我,我立刻通知把楼给拆了!

我给母校捐了一栋楼,校庆名单却没有我,我立刻通知把楼给拆了!

张道陵秘话
2025-12-26 23:48:31
反常!国内金价涨破1400元!黄金回收却遇冷!为什么会这样?

反常!国内金价涨破1400元!黄金回收却遇冷!为什么会这样?

趣味萌宠的日常
2025-12-28 01:12:27
2026年元旦起!身份证=老年证,全国老人免办新证,7大福利刷证就能享

2026年元旦起!身份证=老年证,全国老人免办新证,7大福利刷证就能享

阿芒娱乐说
2025-12-27 17:08:42
张水华遭中国田协除名背后!绝非工作人员失误 存2种可能:争议大

张水华遭中国田协除名背后!绝非工作人员失误 存2种可能:争议大

风过乡
2025-12-28 07:20:23
只剩1%的人在完全手写代码,近七成Vibe产品仅需一个月就可上线 | 2025中国Vibe创作生态报告发布

只剩1%的人在完全手写代码,近七成Vibe产品仅需一个月就可上线 | 2025中国Vibe创作生态报告发布

InfoQ
2025-12-27 10:20:22
最近的蔚来,让人倒吸一口凉气

最近的蔚来,让人倒吸一口凉气

雷峰网
2025-12-25 19:59:51
全国财政工作会议在北京召开

全国财政工作会议在北京召开

界面新闻
2025-12-28 12:07:59
尼克松访华时留意到 “打倒美帝国主义” 的标语,毛主席用风趣的话语化解尴尬,尼克松听后爽朗大笑

尼克松访华时留意到 “打倒美帝国主义” 的标语,毛主席用风趣的话语化解尴尬,尼克松听后爽朗大笑

清风鉴史
2025-12-20 18:40:22
多纳鲁马晒称重照片,哈兰德打趣他:现在可以放心去吃烤肉了

多纳鲁马晒称重照片,哈兰德打趣他:现在可以放心去吃烤肉了

懂球帝
2025-12-28 07:40:53
中方制裁精准打击,美军工遭重创,特朗普气急败坏摆上台面

中方制裁精准打击,美军工遭重创,特朗普气急败坏摆上台面

音乐时光的娱乐
2025-12-28 15:01:55
51岁小李子罕见公开亲吻女友,望向27岁意大利超模,尽显温柔

51岁小李子罕见公开亲吻女友,望向27岁意大利超模,尽显温柔

译言
2025-12-28 09:59:33
1958年,张治中对毛主席说:有个人借我3000元未还,他官很大

1958年,张治中对毛主席说:有个人借我3000元未还,他官很大

知鉴明史
2025-12-28 16:05:02
2025-12-28 16:55:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1678文章数 72关注度
往期回顾 全部

科技要闻

AR眼镜第一案,究竟在争什么?

头条要闻

环球:美媒一定程度上承认了“斩杀线”存在

头条要闻

环球:美媒一定程度上承认了“斩杀线”存在

体育要闻

83分钟绝杀!曼城2-1年度收官:英超6连胜狂飙

娱乐要闻

姚晨打卡绝版机位 高崎机场背后的遗憾

财经要闻

英伟达的收购史

汽车要闻

理想的2026:L9不容有失,i9再战纯电?

态度原创

游戏
家居
亲子
健康
公开课

反复鞭尸!玩家让《星鸣特攻》黑人女性一秒变女神

家居要闻

格调时尚 智慧品质居所

亲子要闻

90后魔丸宝妈带娃的一天:我不是蛋神

这些新疗法,让化疗不再那么痛苦

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版