Python 中的 Lambda 函数

什么是 Lambda 函数?


在 Python 中,函数是对象:它们可以分配给变量,可以从其他函数返回,存储在列表或字典中并作为其他函数的参数传递。 例如,考虑 map() 内置功能。 它的语法是 map(function, iterable) 它用于方便地应用 function 对每一个元素 iterable.

map() 实际上返回一个 iterator 目的。 在实践中,我们将结果作为 list, tuple, set, dict等,以更方便的为准。

假设您想要使用以下方法对列表的每一项进行平方 map() 功能。 为了做到这一点,我们将定义一个 square() 函数并将其用作参数 map():

my_list = [1,2,3,4,5]
def square(x):
    return x**2

my_modified_list = list(map(square, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]


但是,如果只使用我们的 square() 函数是创建这个列表,使用一个更干净 lambda 功能:

my_list = [1,2,3,4,5]
my_modified_list = list(map(lambda x: x**2, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]

在Python中, lambda 函数是匿名函数,其名称和语法来自 Alonzo Church 的 λ演算. 它们的语法是:

lambda x_1,..., x_n : expression(x_1, ..., x_n)

这将创建一个匿名函数,该函数接收变量作为输入 x_1, ..., x_n 并返回评估 expression(x_1, ..., x_n).

在我们看来, lambda 函数将用作接受函数作为参数的函数的参数,就像我们所做的那样 map() 多于。 Python 允许你分配一个 lambda 变量的函数,但是 PEP 8 风格指南 建议不要这样做。 如果要将一个简单的函数分配给一个变量,最好将其作为单行定义来完成。 这确保生成的对象被正确命名,提高回溯可读性:

anonymous_square = lambda x : x**2def named_square(x): return x**2print(anonymous_square.__name__)
print(named_square.__name__)


a = anonymous_square
b = named_square
print(a.__name__)
print(b.__name__)

为什么使用 Lambda 函数?

在最后一段之后,您可能想知道为什么要使用 lambda 功能。 毕竟,任何可以用 lambda 函数可以用命名函数来完成。

这个问题的答案是 lambda 功能 目的 是存在于表示计算的较大表达式中。 考虑这一点的一种方法是类比变量和值。 考虑以下代码:

x = 2

变量 x 是整数的占位符(或名称) 2. 例如,调用 print(x)print(2) 给出完全相同的输出。 在功能的情况下:

def square(x): return x**2

该功能 square() 是计算平方数的占位符。 这个计算可以用一种无名的方式写成 lambda x: x**2.

在这个哲学题外话之后,让我们看一些应用示例 lambda 功能。

将 Lambda 与 sorted() 函数结合使用

sorted() 函数对可迭代对象进行排序。 它接受一个函数作为它的 key 参数,以及应用于可迭代对象的每个元素的函数的结果用于对元素进行排序。

这非常适合 lambda 功能:通过设置 key 参数与 lambda 函数,我们可以按元素的任何一种属性进行排序。 例如,我们可以按姓氏对姓名列表进行排序:

name_list = ['Grace Hopper', 'Ada Lovelace', 'Emmy Noether', 'Marie Curie']
​
sorted_by_surname = sorted(name_list, key = lambda x: x.split()[1])
​
print(sorted_by_surname)
['Marie Curie', 'Grace Hopper', 'Ada Lovelace', 'Emmy Noether']

将 Lambda 与“filter()”函数结合使用

filter() 函数具有以下语法: filter(function, iterable) 它输出的元素 iterable 哪个评估 function(element) 为真(它类似于 WHERE SQL 中的子句)。 我们可以用 lambda 函数作为参数 filter() 从可迭代对象中选择元素。

考虑以下示例:

num_list = list(range(0,100))
​
multiples_of_15= filter(lambda x: (x % 3 == 0) and (x % 5 == 0), num_list)
​
print(list(multiples_of_15))
[0, 15, 30, 45, 60, 75, 90]

filter() 应用 lambda 功能 lambda x: (x % 3 == 0) and (x % 5 == 0) 对每个元素 range(0,100),并返回一个 filter 目的。 我们通过将其转换为来访问元素 list.

将 Lambda 与 map() 函数结合使用


我们的最后一个例子是我们在介绍中看到的—— map() 功能。 的 map() 函数语法是: map(function, iterable)map() 适用 function 对每个元素 iterable,返回一个 map 可以通过强制转换为 a 来访问的对象 list.

我们已经看到了如何将其应用于列表,但它可以应用于使用 dict.items() 方法:

my_data = {'Mary':1, 'Alice':2, 'Bob':0}
map_obj = map(lambda x: f'{x[0]} had {x[1]} little lamb', my_data.items())
print(', '.join((map_obj)))
Mary had 1 little lamb, Alice had 2 little lamb, Bob had 0 little lamb

或字符串:

my_string = 'abcdefg'
''.join(map(lambda x: chr(ord(x)+2),my_string))
'cdefghi'

查看我们的 Git 学习实践指南,其中包含最佳实践、行业认可的标准以及随附的备忘单。 停止谷歌搜索 Git 命令,实际上 学习 它!

我们可以使用 map() 以巧妙的方式发挥作用——一个例子是将许多功能应用于同一输入。

例如,假设您正在创建一个接收文本字符串的 API,并且您希望对其应用一系列函数。

每个函数都从文本中提取一些特征。 我们要提取的特征是单词的个数,第二个单词和第四个单词的第四个字母:

def number_of_words(text):
  return len(text.split())
​
def second_word(text):
  return text.split()[1]
​
def fourth_letter_of_fourth_word(text):
  return text.split()[3][3]
​
function_list = [number_of_words, second_word, fourth_letter_of_fourth_word]
​
my_text = 'Mary had a little lamb'
map_obj = map(lambda f: f(my_text), function_list)
​
feature_list = list(map_obj)
​
print(feature_list)
[5, 'had', 't']

结论


在本指南中,我们探索了 lambda Python 中的函数。 我们已经看到了 lambda 函数是匿名函数,用作其他函数的内联函数参数。 我们已经看到了一些用例以及何时不使用它们。

编程时,请务必牢记 Donald Knuth 的名言:“程序是供人类阅读的,只是偶然地供计算机执行。” 考虑到这一点, lambda 函数是简化代码的有用工具,但应该明智地使用。

时间戳记:

更多来自 堆栈滥用