Python Lambda函数

Python Lambda 函数是匿名函数,意味着该函数没有名称。我们已经知道,def关键字用于在 Python 中定义普通函数。类似地,Python中的lambda关键字用于定义匿名函数。 

Python Lambda 函数语法

语法: lambda 参数:表达式

  • 该函数可以有任意数量的参数,但只能有一个表达式,该表达式将被计算并返回。
  • 只要需要函数对象,就可以自由使用 lambda 函数。
  • 您需要记住,lambda 函数在语法上仅限于单个表达式。
  • 除了函数中的其他类型的表达式之外,它在特定的编程领域还有多种用途。

Python Lambda 函数示例

在示例中,我们定义了一个 lambda 函数(upper ),使用upper()将字符串转换为大写。

str1 = 'JkhxwforGeeks'

upper = lambda string: string.upper()
print(upper(str1))

输出:

JKHXWFORGEEKS

Python 中 Lambda 函数的使用

让我们看看 Python lambda 函数的一些实际用途。

使用 Python lambda 函数进行条件检查

这里,format_numric调用lambda函数,并将num作为参数传递来执行操作。

format_numeric = lambda num: f"{num:e}" if isinstance(num, int) else f"{num:,.2f}"

print("Int formatting:", format_numeric(1000000))
print("float formatting:", format_numeric(999999.789541235))

输出:

Int formatting: 1.000000e+06
float formatting: 999,999.79

Lambda函数和def定义函数之间的区别

def cube(y):
	return y*y*y

lambda_cube = lambda y: y*y*y

# using function defined
# using def keyword
print("Using function defined with `def` keyword, cube:", cube(5))

# using the lambda function
print("Using lambda function, cube:", lambda_cube(5))

输出:

Using function defined with `def` keyword, cube: 125
Using lambda function, cube: 125

正如我们在上面的示例中看到的,cube()函数和lambda_cube()函数的行为相同且符合预期。让我们进一步分析一下上面的例子:

具有 lambda 函数没有 lambda 函数
支持返回某些值的单行有时语句。支持功能块内任意数量的行
适合执行简短的操作/数据操作。适合任何需要多行代码的情况。
使用 lambda 函数有时会降低代码的可读性。我们可以使用注释和功能描述来方便阅读。

Python lambda 函数的实际用途

具有列表理解功能的 Python Lambda 函数

这段代码创建了一个名为 is_even_list 的列表,其中包含了四个 lambda 函数。这些 lambda 函数用于将每个 x 值乘以 10,其中 x 的值在范围从 1 到 4。 然后,代码使用 for 循环迭代 is_even_list 中的每个 lambda 函数,并调用它们以获取计算后的值。

is_even_list = [lambda arg=x: arg * 10 for x in range(1, 5)]

# 迭代每个 lambda 函数并调用它们以获取计算后的值
for item in is_even_list:
    print(item())

输出:

10
20
30
40

Python Lambda 函数与 if-else

在这里,我们使用Max lambda 函数来查找两个整数中的最大值。

# Example of lambda function using if-else
Max = lambda a, b : a if(a > b) else b

print(Max(1, 2))

输出:

2

这是一个使用 lambda 函数和条件表达式的示例。这个 lambda 函数被命名为 Max,它接受两个参数 a 和 b,然后返回 a 如果 a 大于 b,否则返回 b。

具有多个语句的 Python Lambda

Lambda 函数不允许多个语句,但是,我们可以创建两个 lambda 函数,然后调用另一个 lambda 函数作为第一个函数的参数。让我们尝试使用 lambda 查找第二个最大元素。

List = [[2,3,4],[1, 4, 16, 64],[3, 6, 9, 12]]

# 对每个子列表进行排序
sortList = lambda x: (sorted(i) for i in x)

# 获取第二大的元素
secondLargest = lambda x, f : [y[len(y)-2] for y in f(x)]
res = secondLargest(List, sortList)

print(res)

输出:

[3, 16, 9]

上面的这段代码首先定义了一个名为 List 的列表,其中包含了三个子列表。接下来,代码定义了两个 lambda 函数:

  1. sortList 函数用于对输入的列表中的每个子列表进行排序。
  2. secondLargest 函数用于查找每个子列表中的第二大元素。

然后,代码调用 secondLargest 函数,并将 List 和 sortList 作为参数传递。最后,结果存储在变量 res 中,并打印出来。

将 lambda() 函数与 filter() 一起使用

Python 中的 filter() 函数接受一个函数和一个列表作为参数。这提供了一种优雅的方式来过滤掉序列“sequence”中的所有元素,函数返回 True。这是一个从输入列表中返回奇数的小程序: 

使用filter()和lambda函数过滤掉所有奇数

此处,如果 x 不为偶数,则 lambda x: (x % 2 != 0) 返回 True 或 False。由于 filter() 只保留生成True 的元素,因此它会删除生成False的所有奇数。

li = [5, 7, 22, 97, 54, 62, 77, 23, 73, 61]

final_list = list(filter(lambda x: (x % 2 != 0), li))
print(final_list)

输出:

[5、7、97、77、23、73、61]

使用 lambda 和 filter() 函数过滤所有年龄超过 18 岁的人

# Python 3 code to people above 18 yrs
ages = [13, 90, 17, 59, 21, 60, 5]

adults = list(filter(lambda age: age > 18, ages))

print(adults)

输出:

[90, 59, 21, 60]

将 lambda() 函数与 map() 一起使用

Python 中的 map() 函数接受一个函数和一个列表作为参数。使用 lambda 函数和一个列表调用该函数,并返回一个新列表,其中包含该函数为每个项目返回的所有 lambda 修改项。例子: 

使用 lambda 和 map() 函数将列表的所有元素乘以 2

# 原始列表
li = [5, 7, 22, 97, 54, 62, 77, 23, 73, 61]

# 使用 map() 和 lambda 表达式计算每个元素的两倍值
final_list = list(map(lambda x: x*2, li))

# 打印结果列表
print(final_list)

输出:

[10、14、44、194、108、124、154、46、146、122]

使用 lambda 和 map() 函数将列表的所有元素转换为大写

# 原始动物名称列表
animals = ['dog', 'cat', 'parrot', 'rabbit']

# 使用 map() 函数和 lambda 表达式将动物名称转换为大写字母
uppered_animals = list(map(lambda animal: animal.upper(), animals))

# 打印结果列表
print(uppered_animals)

输出:

['DOG', 'CAT', 'PARROT', 'RABBIT']

将 lambda() 函数与 reduce() 一起使用

Python 中的reduce ()函数接受一个函数和一个列表作为参数。使用 lambda 函数调用该函数并返回一个可迭代的新结果。这对可迭代对象对执行重复操作。reduce() 函数属于functools模块。 

使用 lambda 和 reduce() 函数求列表中所有元素的总和

from functools import reduce

# 原始整数列表
li = [5, 8, 10, 20, 50, 100]

# 使用 reduce() 函数和 lambda 表达式计算列表中所有元素的总和
sum = reduce((lambda x, y: x + y), li)

# 打印总和
print(sum)

输出:

193

这里前两个元素的结果被添加到下一个元素,这样一直持续到列表末尾,如 (((((5+8)+10)+20)+50)+100)。

使用 lambda 和 reduce() 函数查找列表中的最大元素

# 导入 functools 以使用 reduce() 函数
import functools

# 初始化列表
lis = [1, 3, 5, 6, 2]

# 使用 reduce() 函数和 lambda 表达式计算列表中的最大元素
max_element = functools.reduce(lambda a, b: a if a > b else b, lis)

# 打印最大元素
print("列表中的最大元素是:", max_element)

输出:

列表中的最大元素是: 6