如何在 Python 中使用 Lambda 函数【附示例】

已发表: 2022-11-10

在本教程中,您将了解有关 Python 中 lambda 函数的所有信息——从定义 lambda 函数的语法到带有代码示例的不同用例。

在 Python 中,lambda 是具有简洁语法的匿名函数,可以与其他有用的内置函数一起使用。 在本教程结束时,您将了解如何定义 lambda 函数以及何时应该考虑在常规 Python 函数上使用它们。

让我们开始!

Python Lambda 函数:语法和示例

这是在 Python 中定义 lambda 函数的一般语法:

 lambda parameter(s):return value

在上述通用语法中:

  • lambda是定义 lambda 函数时应使用的关键字,后跟一个或多个函数应采用的参数
  • 有一个冒号分隔参数和返回值

定义 lambda 函数时,应确保通过计算跨越单行代码的表达式来计算返回值。 当我们编写示例代码时,您会更好地理解这一点。

Python Lambda 函数示例

理解 lambda 函数的最好方法是从将常规 Python 函数重写为 lambda 函数开始。

您可以在 Python REPL 或 Geekflare 的在线 Python 编辑器中编写代码。

#1 。 考虑以下函数square() ,它接受一个数字num作为参数并返回该数字的平方。

 def square(num): return num*num

您可以使用参数调用该函数并验证它是否正常工作。

 >>> square(9) 81 >>> square(12) 144

您可以将此 lambda 表达式分配给一个变量名,例如square1以使函数定义更简洁: square1 = lambda num: num*num然后以任意数字作为参数调用square1函数。 但是,我们知道 lambda 是匿名函数,因此您应该避免将它们分配给变量。

对于函数square() ,参数为num ,返回值为num*num 。 在我们确定了这些之后,我们可以将它们插入 lambda 表达式并使用参数调用它,如下所示:

 >>> (lambda num: num*num)(2) 4

这是立即调用函数表达式的概念,我们在定义函数后立即调用它。

#2 。 接下来,让我们重写另一个简单的函数add() ,它接受数字num1num2并返回它们的和num1 + num2

 def add(num1,num2): return num1 + num2

让我们用两个数字作为参数调用add()函数:

 >>> add(4,3) 7 >>> add(12,5) 17 >>> add(12,6) 18

在这种情况下, num1num2是两个参数,返回值为num1 + num2

 >>> (lambda num1, num2: num1 + num2)(3,7) 10

Python 函数也可以采用参数的默认值。 让我们修改add()函数的定义,将num2参数的默认值设置为 10。

 def add(num1, num2=10): return num1 + num2

在以下函数调用中:

  • 在第一个函数调用中, num1的值为 1, num2的值为 3。当您在函数调用中传入num2的值时,将使用该值; 函数返回 4。
  • 但是,如果您只传入一个参数( num1为 7),则默认值 10 用于num2 ; 函数返回 17。
 >>> add(1,3) 4 >>> add(7) 17

在编写将某些参数的默认值作为 lambda 表达式的函数时,您可以在定义参数时指定默认值。

 >>> (lambda num1, num2 = 10: num1 + num2)(1) 11

什么时候应该在 Python 中使用 Lambda 函数?

现在您已经了解了 Python 中 lambda 函数的基础知识,这里有一些用例:

  • 当你有一个函数的返回表达式是一行代码并且你不需要在同一个模块的其他地方引用该函数时,你可以使用 lambda 函数。 我们还编写了一些示例来理解这一点。
  • 您可以在使用内置函数时使用 lambda 函数,例如 map()、filter() 和 reduce()。
  • Lambda 函数有助于对 Python 数据结构(例如列表和字典)进行排序。

如何将 Python Lambda 与内置函数一起使用

1. 使用 Lambda 和 map()

map()函数接受一个可迭代对象和一个函数,并将该函数应用于可迭代对象中的每个项目,如下所示:

python-lambda-with-map

让我们创建一个nums列表并使用map()函数创建一个新列表,其中包含nums列表中每个数字的平方。 注意使用 lambda 函数来定义平方运算。

 >>> nums = [4,5,6,9] >>> list(map(lambda num:num*num,nums)) [16, 25, 36, 81]

由于map()函数返回一个地图对象,我们应该将它转换成一个列表。

️ 查看本教程,了解 Python 中的 map() 函数。

2. 使用 Lambda 和 filter()

让我们定义nums ,一个数字列表:

 >>> nums = [4,5,6,9]

假设您想过滤此列表并仅保留奇数。

您可以使用 Python 的内置filter()函数。

filter()函数接受一个条件和一个可迭代对象filter(condition, iterable) 。 结果仅包含原始迭代中满足条件的元素。 您可以将返回的对象转换为 Python 可迭代对象,例如列表。

python-lambda-with-filter

为了过滤掉所有的偶数,我们只保留奇数。 所以 lambda 表达式应该是lambda num: num%2!=0 。 数量num%2num除以 2 的余数。

  • num为奇数时, num%2!=0True ,并且
  • 只要num是偶数, num%2!=0就是False
 >>> nums = [4,5,6,9] >>> list(filter(lambda num:num%2!=0,nums)) [5, 9]

3. 使用 Lambda 和 reduce()

reduce()函数接受一个可迭代的和一个函数。 它通过将函数迭代地应用于可迭代的项目来减少可迭代。

python-lambda-with-reduce

要使用reduce()函数,您必须从 Python 的内置functools模块中导入它:

 >>> from functools import reduce

让我们使用reduce()函数来计算nums列表中所有数字的总和。 我们定义一个 lambda 表达式: lambda num1,num2:num1+num2 ,作为归约和函数。

归约操作将像这样发生:f(f(f(4,5),6),9) = f(f(9,6),9) = f(15,9) = 24。这里,f 是对列表中两项的求和运算,由 lambda 函数定义。

 >>> from functools import reduce >>> nums = [4,5,6,9] >>> reduce(lambda num1,num2:num1+num2,nums) 24

用于自定义排序的 Python Lambda 函数

除了使用带有内置 Python 函数的 lambda 函数(例如map()filter()reduce()之外,您还可以使用它们来自定义用于排序的内置函数和方法。

图像

1. 对 Python 列表进行排序

使用 Python 列表时,您通常必须根据某些排序标准对它们进行排序。 要对 Python 列表进行适当的排序,您可以对它们使用内置的sort()方法。 如果您需要列表的排序副本,可以使用sorted()函数。

使用 Python 的sorted()函数的语法是sorted(iterable, key=...,reverse= True | False)

key参数用于自定义排序。
reverse参数可以设置为TrueFalse ; 默认值为False

对数字和字符串列表进行排序时,默认排序分别为升序和字母顺序。 但是,您有时可能想要定义一些自定义的排序标准。

考虑以下列表fruits 。 假设您想要获取列表的排序副本。 您应该根据字符串中“p”的出现次数对字符串进行排序——按降序排列。

 >>> fruits = ['apple','pineapple','grapes','mango']

是时候使用可选的key参数了。 字符串在 Python 中是可迭代的,要获取其中字符出现的次数,可以使用内置的.count()方法。 因此,我们将key设置为lambda x:x.count('p') ,以便根据字符串中 'p' 出现的次数进行排序。

 >>> fruits = ['apple','pineapple','grapes','mango'] >>> sorted(fruits,key=lambda x:x.count('p'),reverse=True) ['pineapple', 'apple', 'grapes', 'mango']

在这个例子中:

  • 排序的key是字符“p”的出现次数,它被定义为 lambda 表达式。
  • 当我们将reverse参数设置为True时,排序按照“p”出现次数的递减顺序进行。

fruits列表中,'pineapple' 包含 3 次出现的 'p',字符串 'apple'、'grapes' 和 'mango' 分别包含 2、1 和 0 次出现的 'p'。

了解稳定排序

考虑另一个例子。 对于相同的排序标准,我们重新定义了fruits列表。 这里,'p' 分别出现在字符串 'apple' 和 'grapes' 中两次和一次。 它永远不会出现在字符串 'mango' 和 'melon' 中。

 >>> fruits = ['mango','apple','melon','grapes'] >>> sorted(fruits,key=lambda x:x.count('p'),reverse=True) ['apple', 'grapes', 'mango', 'melon']

在输出列表中,'mango' 出现在 'melon' 之前,即使它们都没有字符 'p'。 但为什么会这样呢? sorted()函数执行稳定排序; 因此,当两个字符串的“p”计数相等时,原始fruits列表中的元素顺序将被保留。

作为一个快速练习,交换fruits列表中“芒果”和“甜瓜”的位置,根据相同的标准对列表进行排序,然后观察输出。

️ 了解更多关于排序 Python 列表的信息。

2. 对 Python 字典进行排序

您还可以在对 Python 字典进行排序时使用 lambda。 考虑以下包含项目及其价格的字典price_dict

 >>> price_dict = { ... 'Milk':10, ... 'Honey':15, ... 'Bread':7, ... 'Candy':3 ... }

要将字典的键值对作为元组列表获取,可以使用内置字典方法.items()

 >>> price_dict_items = price_dict.items() dict_items([('Milk', 10), ('Honey', 15), ('Bread', 7), ('Candy', 3)])

在 Python 中,所有可迭代对象:列表、元组、字符串等都遵循零索引。 所以第一项在索引 0 处,第二项在索引 1 处,依此类推。

我们想按值排序,即字典中每个项目的价格。 在price_dict_items列表中的每个元组中,索引 1 处的项目是价格。 因此,我们将key设置为lambda x:x[1] ,因为它将使用索引 1 处的项目(价格)对字典进行排序。

 >>> dict(sorted(price_dict_items,key=lambda x:x[1])) {'Candy': 3, 'Bread': 7, 'Milk': 10, 'Honey': 15}

在输出中,字典项目已按价格升序排序:从“Candy”开始,价格为 3 个单位,到“Honey”,价格为 15 个单位。

️ 要了解更多信息,请查看有关按键和值对 Python 字典进行排序的详细指南。

加起来

你有它! 您已经学习了如何定义 lambda 函数并将它们与其他 Python 内置函数有效地结合使用。 以下是关键要点的摘要:

  • 在 Python 中,lambda 是匿名函数,可以接受多个参数并返回一个值; 要评估以生成此返回值的表达式应该是一行代码。 它们可用于使小函数定义更简洁。
  • 要定义 Lambda 函数,您可以使用以下语法: lambda parameter(s): return value
  • 一些重要的用例包括将它们与map()filter()reduce()函数一起使用,并作为自定义 Python 迭代排序的关键参数。

接下来,学习如何在 Python 中执行地板除法。