如何在Python中使用Lambda函数 [附带示例]

在本教程中,您将学习有关Python中的lambda函数的所有内容-从定义lambda函数的语法到使用示例代码的不同用途。

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

让我们开始吧!

Python Lambda函数:语法和示例

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

lambda 参数(s): 返回值

在上述一般语法中:

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

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

Python Lambda函数示例

理解lambda函数的最佳方法是将常规Python函数重写为lambda函数。

👩🏽‍💻您可以在Python REPL或Geekflare’s online Python editor中进行编码。

#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

这是Immediately Invoked Function Expression的概念,我们在定义后立即调用一个函数。

#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),则num2的默认值为10;函数返回17。
>>> add(1,3)
4
>>> add(7)
17

当编写函数时,可以使用lambda表达式为某些参数指定默认值,以便在定义参数时指定默认值。

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

在Python中何时使用Lambda函数?

现在您已经学习了Python中lambda函数的基础知识,以下是一些使用情况:

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

如何在Python中使用Lambda与内置函数

#1. 使用map()与Lambda

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

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

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

由于map()函数返回一个map对象,因此我们需要将其转换为列表。

▶️ 在此教程中查看有关map() function in Python的内容。

#2. 使用filter()与Lambda

让我们定义一个名为nums的数字列表:

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

假设您希望筛选此列表并仅保留奇数。

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

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

要过滤掉所有偶数,我们将仅保留奇数。因此,lambda表达式应为lambda num: num%2!=0。数量num%2是当num除以2时的余数。

  • 当num为奇数时,num%2!=0为True,
  • 当num为偶数时,num%2!=0为False。
>>> nums = [4,5,6,9]
>>> list(filter(lambda num:num%2!=0,nums))
[5, 9]

#3. 使用reduce()与Lambda

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 函数自定义排序

除了将 lambda 函数与内置的 Python 函数(如 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 列表中元素的顺序。

作为一个快速的练习,交换 ‘mango' 和 ‘melon' 在 fruits 列表中的位置,根据相同的准则对列表进行排序,并观察输出。

▶️ 了解更多关于 sorting Python lists的信息。

#2. 对 Python 字典进行排序

您还可以在对 Python 字典进行排序时使用 lambda 表达式。考虑以下包含物品和价格的字典 price_dict

将英文翻译成简体中文,保留,及HTML标签。

>>> 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}

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

▶️ 要了解更多信息,请查阅这篇详细指南:sorting a Python dictionary by key and value

总结

以上就是全部内容!您已经学会了如何定义lambda函数并有效地与其他Python内置函数一起使用。以下是要点总结:

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

接下来,了解如何执行floor division in Python。还可以了解更多关于python sleep function的信息。

类似文章