hyperframes:HTML+CSS+MP4帧级动效新范式
2026/10/29 7:47:34
lambda是Python中的匿名函数,用于创建小型、一次性的函数对象。它的基本语法是:
lambdaarguments:expressionlambda是关键字arguments是函数的参数(可以是多个)expression是返回值表达式(只能是单个表达式)# 普通函数defadd(x,y):returnx+y# lambda等价写法add_lambda=lambdax,y:x+yprint(add(5,3))# 输出: 8print(add_lambda(5,3))# 输出: 8square=lambdax:x**2print(square(4))# 输出: 16multiply=lambdax,y,z:x*y*zprint(multiply(2,3,4))# 输出: 24get_pi=lambda:3.14159print(get_pi())# 输出: 3.14159与map()函数结合:
numbers=[1,2,3,4,5]# 使用lambda将每个元素平方squared=list(map(lambdax:x**2,numbers))print(squared)# 输出: [1, 4, 9, 16, 25]# 多列表操作list1=[1,2,3]list2=[4,5,6]result=list(map(lambdax,y:x+y,list1,list2))print(result)# 输出: [5, 7, 9]与filter()函数结合:
numbers=[1,2,3,4,5,6,7,8,9,10]# 筛选偶数evens=list(filter(lambdax:x%2==0,numbers))print(evens)# 输出: [2, 4, 6, 8, 10]# 筛选大于5的数greater_than_five=list(filter(lambdax:x>5,numbers))print(greater_than_five)# 输出: [6, 7, 8, 9, 10]与sorted()函数结合:
# 按字符串长度排序words=["apple","banana","cherry","date","elderberry"]sorted_by_length=sorted(words,key=lambdax:len(x))print(sorted_by_length)# 输出: ['date', 'apple', 'banana', 'cherry', 'elderberry']# 按元组第二个元素排序pairs=[(1,9),(2,8),(3,7),(4,6),(5,5)]sorted_pairs=sorted(pairs,key=lambdax:x[1])print(sorted_pairs)# 输出: [(5, 5), (4, 6), (3, 7), (2, 8), (1, 9)]# 按字典值排序students=[{"name":"Alice","score":85},{"name":"Bob","score":92},{"name":"Charlie","score":78}]sorted_students=sorted(students,key=lambdax:x["score"],reverse=True)print(sorted_students)# 输出: [{'name': 'Bob', 'score': 92}, {'name': 'Alice', 'score': 85}, {'name': 'Charlie', 'score': 78}]reduce()函数结合fromfunctoolsimportreducenumbers=[1,2,3,4,5]# 计算乘积product=reduce(lambdax,y:x*y,numbers)print(product)# 输出: 120# 计算最大值max_value=reduce(lambdax,y:xifx>yelsey,numbers)print(max_value)# 输出: 5defmake_multiplier(n):returnlambdax:x*n double=make_multiplier(2)triple=make_multiplier(3)print(double(5))# 输出: 10print(triple(5))# 输出: 15# 创建幂函数工厂defpower_factory(exp):returnlambdax:x**exp square=power_factory(2)cube=power_factory(3)print(square(4))# 输出: 16print(cube(3))# 输出: 27# 示例:Tkinter按钮事件importtkinterastk root=tk.Tk()# 使用lambda传递参数给事件处理函数foriinrange(5):button=tk.Button(root,text=f"Button{i}",command=lambdanum=i:print(f"Button{num}clicked"))button.pack()root.mainloop()# 带条件判断的lambdafind_max=lambdaa,b:aifa>belsebprint(find_max(10,20))# 输出: 20# 多条件判断categorize=lambdaage:"child"ifage<13else"teen"ifage<20else"adult"print(categorize(15))# 输出: teenprint(categorize(25))# 输出: adult# lambda返回另一个lambdacurry_add=lambdax:lambday:x+y add_five=curry_add(5)print(add_five(3))# 输出: 8# 更复杂的嵌套operation=lambdaop:(lambdax,y:x+yifop=="add"elsex-yifop=="subtract"elsex*yifop=="multiply"elsex/yifop=="divide"elseNone)add_func=operation("add")print(add_func(10,5))# 输出: 15# 生成函数列表functions=[lambdax,i=i:x+iforiinrange(5)]forfinfunctions:print(f(10),end=" ")# 输出: 10 11 12 13 14print()# 注意闭包陷阱(错误写法)wrong_funcs=[lambdax:x+iforiinrange(5)]forfinwrong_funcs:print(f(10),end=" ")# 输出: 14 14 14 14 14# 处理嵌套结构data=[{"name":"Alice","grades":[85,90,78]},{"name":"Bob","grades":[92,88,95]},{"name":"Charlie","grades":[78,85,80]}]# 计算每个学生的平均分并排序sorted_students=sorted(data,key=lambdax:sum(x["grades"])/len(x["grades"]),reverse=True)forstudentinsorted_students:avg=sum(student["grades"])/len(student["grades"])print(f"{student['name']}:{avg:.2f}")| 特性 | lambda函数 | 普通函数(def) |
|---|---|---|
| 函数名 | 匿名 | 有名称 |
| 可读性 | 较差(复杂逻辑) | 较好 |
| 代码长度 | 简短 | 可长可短 |
| 返回值 | 只能是表达式 | 可以是任意语句 |
| 使用场景 | 简单操作、一次性使用 | 复杂逻辑、重复使用 |
| 调试 | 困难 | 容易 |
# 不推荐:复杂逻辑用lambdacomplex_operation=lambdax:(x**2ifx>0elsex*2)ifx%2==0else(x+5ifx<10elsex-3)# 推荐:复杂逻辑用普通函数defcomplex_operation(x):ifx%2==0:returnx**2ifx>0elsex*2else:returnx+5ifx<10elsex-3# 正确做法:使用默认参数传递变量funcs=[lambdax,i=i:x*iforiinrange(5)]# 错误做法:闭包陷阱funcs_bad=[lambdax:x*iforiinrange(5)]对于简单操作,lambda和普通函数性能差异很小。选择使用哪种主要基于代码可读性和使用场景。
lambda表达式是Python中强大的工具,特别适合:
但对于复杂逻辑或需要重复使用的功能,建议使用普通函数(def定义)以提高代码的可读性和可维护性。