Python基础:lambda函数详解

在这里插入图片描述

1. lambda函数概念

  除了一般使用def声明的函数外,Python中还支持lambda匿名函数,可以在任何场合替代def函数。
  匿名函数,通常指的是运行时临时创建的,没有显示命名的函数,它允许快速定义简单的函数。

2. 语法

lambda arguments :expression

  或

lambda argument1,argument2...,argumentn : expression using arguments

  lambda 是关键字
  arguments是参数,可以是0个或个,用逗号分割
  expression是一个表达式,描述了函数的返回值

  lambda关键字用于创建小巧的匿名函数。lambda a, b: a+b 函数返回两个参数的和。Lambda 函数可用于任何需要函数对象的地方。在语法上,匿名函数只能是单个表达式。在语义上,它只是常规函数定义的语法糖。与嵌套函数定义一样,lambda 函数可以引用包含作用域中的变量。

优点:

  简洁lambda表达式可以快速定义简单的函数,无需使用def语句。
  匿名:由于lambda表达式没有正式的函数名称,因此它们是匿名的,可以用于需要短生命周期函数的情况。
  轻量级lambda表达式只包含一个表达式,因此它们占用内存空间较小,适合用于小型任务。
  可嵌套Lambda表达式可以嵌套在其他函数或代码块中使用,使代码更加紧凑。

缺点:
  只能包含一个表达式Lambda表达式只能包含一个表达式,这意味着它们不能包含多个语句或复杂逻辑。
  调试困难:由于Lambda表达式通常很短,因此很难在调试时设置断点和查看执行流程。
  不支持变量定义Lambda表达式不能定义变量,只能使用已存在的变量。这意味着它们在处理复杂逻辑时可能会受到限制。
  性能问题Lambda表达式可能在性能方面不如使用def语句定义的函数。由于它们通常是轻量级的,因此可能不会进行优化。

3. 简单示例

3.1 参数为零

# lambda返回一个函数对象
arg_zero = lambda : '参数为零的示例'
print(arg_zero())

3.2 通过普通函数和匿名函数分别表示2个数相加

# 普通函数
def add(x, y):
    return x + y
result = add(3, 5)
print(result)  # 输出 8

# 匿名函数(lambda 表达式)
add_lambda = lambda x, y: x + y
result_lambda = add_lambda(3, 5)
print(result_lambda)  # 输出 8

4. lambda表达式的应用场景

4.1 函数参数传递

  将Lambda 表达式作为函数的参数,特别是在需要传递简单函数时,例如 mapfiltersorted 等函数。

"""
   map 函数用于对可迭代对象的每个元素应用一个函数,可以通过 lambda 表达式传递这个函数。
"""
numbers = [1, 2, 3, 4, 5]

squared = list(map(lambda x: x**2, numbers))
print(squared)  # 输出 [1, 4, 9, 16, 25]
"""
    filter 函数用于过滤可迭代对象中的元素,可以通过 lambda 表达式定义过滤条件。
    过滤出偶数
"""
numbers = [1, 2, 3, 4, 5]

even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 输出 [2, 4]
"""
    sorted 函数用于排序可迭代对象,通过 lambda 表达式定义排序规则。
    使用 lambda 表达式按字符串长度排序
"""
words = ['apple', 'banana', 'cherry', 'date']

sorted_words = sorted(words, key=lambda x: len(x))
print(sorted_words)  # 输出 ['date', 'apple', 'banana', 'cherry']

在这里插入图片描述

# 使用 lambda 表达式找出字符串列表中最长和最短的字符串
words = ['apple', 'banana', 'cherry', 'date']
longest_word = max(words, key=lambda x: len(x))
shortest_word = min(words, key=lambda x: len(x))

print("Longest word:", longest_word)  # 输出 Longest word: banana
print("Shortest word:", shortest_word)  # 输出 Shortest word: date

在这里插入图片描述

# 按年龄升序排列,年龄相同则按姓名升序排列
people = [{'name': 'Linda', 'age': 18},{'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}, {'name': 'Charlie', 'age': 30},{'name': 'Scott', 'age': 40}]
sorted_people = sorted(people, key=lambda x: (x['age'], x['name']))
for k in sorted_people:
    print(k)

在这里插入图片描述

4.2 GUI编程

  在GUI编程中,lambda表达式可以用于定义简单的事件处理函数

from tkinter import Button, Tk

# 创建简单的 GUI 窗口
root = Tk()
# 定义按钮点击事件处理函数
button_click_handler = lambda: print("Button clicked!")
# 创建按钮并绑定点击事件
button = Button(root, text="Click me!", command=button_click_handler)
button.pack()
# 启动 GUI 循环
root.mainloop()

4.3 路由处理

  在Web 框架中,使用 Lambda 表达式定义简单的路由处理函数。

from flask import Flask

app = Flask(__name__)

# 使用 lambda 表达式定义路由处理函数
app.route('/hello')(lambda: 'Hello, World!')

if __name__ == '__main__':
    app.run()

4.4 文件处理

  在文件处理中,使用 Lambda 表达式进行简单的文件操作。

# 使用 lambda 表达式按行读取文件内容
with open('example.txt', 'r') as file:
    lines = file.readlines()
    process_line = lambda line: line.strip().upper()
    processed_lines = list(map(process_line, lines))
    print(processed_lines)

4.5 动态创建函数

  在需要动态生成函数的情况下,Lambda 表达式可以用于创建临时函数。

# 使用 lambda 表达式动态生成平方函数
create_squared_function = lambda n: lambda x: x**n
square_of_3 = create_squared_function(3)
print(square_of_3(2))  # 输出 8
from functools import partial

# 使用 lambda 表达式创建一个偏函数,固定第一个参数
power_of_two = partial(lambda x, y: x**y, 2)
result = power_of_two(3)
print(result)  # 输出 8

4.6 使用自定义函数

  可以将 lambda表达式作为自定义函数的参数,使得在函数调用时灵活定义函数行为。

# 自定义函数,接受一个函数参数并应用于两个数
def apply_operation(x, y, operation):
    return operation(x, y)

# 使用 lambda 表达式定义加法操作
result_add = apply_operation(3, 5, lambda x, y: x + y)
print(result_add)  # 输出 8

# 使用 lambda 表达式定义乘法操作
result_multiply = apply_operation(3, 5, lambda x, y: x * y)
print(result_multiply)  # 输出 15

# 使用 lambda 表达式定义除法操作
result_multiply = apply_operation(10, 5, lambda x, y: x // y)
print(result_multiply)  # 输出 2

5. 使用lambda的注意事项

  1)冒号使用: 冒号不是用来开始新的语句块的,而是用来分隔参数和表达式。
  2)参数格式: Lambda函数可以接收任意多个参数,包括可选参数,参数列表不需要用括号。
  3)返回值: Lambda函数返回单个表达式的值,不需要使用return关键字,最后一个表达式的值即为返回值。
  4)表达式数量:Lambda函数只能包含一个表达式,不能包含命令。
  5)语句和循环:Lambda函数不能包含命令(statements),如print语句,对于复杂逻辑需要使用forif循环的,最好使用常规函数以提高可读性和可重用性。
  6)单行函数:Lambda函数通常写在一行上,因此有时被称为单行函数。
  7)程序运行效率:Lambda并不会带来程序运行效率的提高,主要用于代码简洁性。
  8)命名空间: Lambda函数有自己的命名空间,不能访问参数列表之外或全局命名空间中的参数。
  9)可读性: 考虑可读性,应该避免嵌套lambda函数。
  总的来说,lambda函数在处理简单任务和需要一次性使用的小型函数时很有用,但在处理复杂逻辑和需要可读性的情况下,最好使用常规的命名函数。

6. 参考

Python官网:https://docs.python.org/zh-cn/3/tutorial/controlflow.html#lambda-expressions
在这里插入图片描述

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

snail哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值