Python中Lambda函数的使用,Python 是一种面向对象的编程语言,但是当您进行各种函数式编程时,lambda 函数还是非常方便的。本文假设您已经了解 Python 编程以及如何使用常规函数。它还假定您的设备上安装了 Python 3.8 或更高版本。
解释 Python Lambda函数
在 Python 中,函数可以接受一个或多个位置参数或关键字参数、可变参数列表、可变关键字参数列表等。它们可以传递给高阶函数并作为输出返回。常规函数可以有多个表达式和多个语句。他们也总是有一个名字。
Python lambda 函数只是一个匿名函数。它也可以称为无名
函数。普通的 Python 函数由def
关键字定义。Python 中的 Lambda 函数通常由lambda
关键字、任意数量的参数和一个表达式组成。
注意:术语lambda 函数、lambda 表达式和lambda 形式可以互换使用,具体取决于编程语言或程序员。
Lambda 函数主要用作单行函数。它们经常在高阶函数中使用,例如map()
和filter()
。这是因为匿名函数作为参数传递给高阶函数,这不仅在 Python 编程中这样做。
lambda 函数对于在 Python 中处理列表理解也非常有用——为此目的使用 Python lambda 表达式有多种选择。
Lambda 在Tkinter、wxPython、Kivy等UI 框架中用于条件渲染时非常有用。尽管本文未涵盖 Python GUI 框架的工作原理,但一些代码片段显示大量使用 lambda 函数来渲染基于用户的交互。
在深入研究 Python Lambda函数之前需要了解的事情
因为 Python 是一种面向对象的编程语言,所以一切都是对象。Python 类、类实例、模块和函数都作为对象处理。
可以将函数对象分配给变量。
在 Python 中将变量分配给常规函数并不少见。此行为也可以应用于 lambda 函数。这是因为它们是函数对象,即使它们是无名的:
def greet(name): return f'Hello {name}' greetings = greet greetings('Clint') >>>> Hello Clint
高阶函数,如 map()、filter() 和 reduce()
您可能需要在内置函数中使用 lambda 函数,例如filter()
and map()
,and also with reduce()
— 它是从 Python 中的 functools 模块导入的,因为它不是内置函数。默认情况下,高阶函数是接收其他函数作为参数的函数。
如下面的代码示例所示,普通函数可以替换为 lambda,作为参数传递给这些高阶函数中的任何一个:
#map function names = ['Clint', 'Lisa', 'Asake', 'Ada'] greet_all = list(map(greet, names)) print(greet_all) >>>> ['Hello Clint', 'Hello Lisa', 'Hello Asake', 'Hello Ada']
#filter function numbers = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20] def multiples_of_three(x): return x % 3 == 0 print(list(filter(multiples_of_three, numbers))) >>>> [12, 15, 18]
#reduce function numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] def add_numbers(x, y): return x * y print(reduce(add_numbers, numbers)) >>>> 55
语句和表达式的区别
开发人员之间的一个常见混淆点是在编程中区分语句和表达式。
语句是做某事或执行某项操作(例如if
或while
条件)的任何代码段。
表达式由变量、值和运算符的组合组成,并计算出一个新值。
当我们探索 Python 中的 lambda 函数时,这种区别很重要。像下面这样的表达式返回一个值:
square_of_three = 3 ** 2 print(square_of_three) >>>> 9
声明如下所示:
for i in range(len(numbers), 0, -1): if i % 2 == 1: print(i) else: print('even') >>>> even 9 even 7 even 5 even 3 even 1
如何使用 Python Lambda函数
Python 风格指南规定每个 lambda 函数都必须以关键字开头lambda
(不同于以关键字开头的普通函数def
)。lambda 函数的语法通常是这样的:
lambda arguments : expression
Lambda 函数可以采用任意数量的位置参数和/或关键字参数,后跟一个冒号和一个表达式。不能有一个以上的表达式,因为它在语法上受到限制。让我们检查下面的 lambda 表达式示例:
add_number = lambda x, y : x + y print(add_number(10, 4)) >>>> 14
在上面的示例中,lambda 表达式被分配给了变量add_number
。通过传递参数进行函数调用,其计算结果为 14。
下面我们再举一个例子:
discounted_price = lambda price, discount = 0.1, vat = 0.02 : price * (1 - discount) * (1 + vat) print(discounted_price(1000, vat=0.04, discount=0.3)) >>>> 728.0
如上所示,lambda 函数的计算结果为 728.0。Python lambda 函数中使用了位置参数和关键字参数的组合。在使用位置参数时,我们无法更改函数定义中列出的顺序。但是,我们只能将关键字参数放在位置参数之后的任何位置。
Lambda 函数始终像JavaScript 中的立即调用函数表达式(IIFE) 一样执行。这主要与 Python 解释器一起使用,如以下示例所示:
print((lambda x, y: x - y)(45, 18)) >>>> 27
lambda 函数对象包含在括号中,另一对括号紧跟传递的参数。作为 IIFE,对表达式求值并且函数返回分配给变量的值。
Python lambda 函数也可以在列表理解中执行。列表理解总是有一个输出表达式,它被一个 lambda 函数代替。这里有些例子:
my_list = [(lambda x: x * 2)(x) for x in range(10) if x % 2 == 0] print(my_list) >>>> [0, 4, 8, 12, 16]
value = [(lambda x: x % 2 and 'odd' or 'even')(x) for x in my_list] print(value) >>>> ['even', 'even', 'even', 'even', 'even']
在 Python 中编写三元表达式时可以使用 Lambda 函数。三元表达式根据给定条件输出结果。查看以下示例:
test_condition1 = lambda x: x / 5 if x > 10 else x + 5 print(test_condition1(9)) >>>> 14
test_condition2 = lambda x: f'{x} is even' if x % 2 == 0 else (lambda x: f'{x} is odd')(x) print(test_condition2(9)) >>>> 9 is odd
高阶函数中的 Lambda函数
高阶函数的概念在 Python 中很流行,就像在其他语言中一样。它们是接受其他函数作为参数并返回函数作为输出的函数。
在 Python 中,高阶函数有两个参数:一个函数和一个可迭代对象。函数参数应用于可迭代对象中的每个项目。由于我们可以将函数作为参数传递给高阶函数,因此我们同样可以传入 lambda 函数。
以下是与该函数一起使用的 lambda 函数的一些示例map()
:
square_of_numbers = list(map(lambda x: x ** 2, range(10))) print(square_of_numbers) >>>> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
strings = ['Nigeria', 'Ghana', 'Niger', 'Kenya', 'Ethiopia', 'South Africa', 'Tanzania', 'Egypt', 'Morocco', 'Uganda'] length_of_strings = list(map(lambda x: len(x), strings)) print(length_of_strings) >>>> [7, 5, 5, 5, 8, 12, 8, 5, 7, 6]
以下是与该函数一起使用的一些 lambdafilter()
函数:
length_of_strings_above_five = list(filter(lambda x: len(x) > 5, strings)) print(length_of_strings_above_five) >>>> ['Nigeria', 'Ethiopia', 'South Africa', 'Tanzania', 'Morocco', 'Uganda']
fruits_numbers_alphanumerics = ['apple', '123', 'python3', '4567', 'mango', 'orange', 'web3', 'banana', '890'] fruits = list(filter(lambda x: x.isalpha(), fruits_numbers_alphanumerics)) numbers = list(filter(lambda x: x.isnumeric(), fruits_numbers_alphanumerics)) print(fruits) print(numbers) >>>> ['apple', 'mango', 'orange', 'banana'] ['123', '4567', '890']
以下是与该函数一起使用的一些 lambdareduce()
函数:
values = [13, 6, 12, 23, 15, 31, 16, 21] max_value = reduce(lambda x,y: x if (x > y) else y, values) print(max_value) >>>> 31
nums = [1, 2, 3, 4, 5, 6] multiplication_of_nums = reduce(lambda x,y: x*y, nums) print(multiplication_of_nums) >>>> 720
结论
尽管 Python lambda 可以显着减少您编写的代码行数,但应谨慎使用,仅在必要时才使用。代码的可读性应优先于简洁性。对于更具可读性的代码,请始终使用适合 lambda 函数的普通函数,如Python Style Guide所推荐的那样。
Lambda 可以非常方便地使用 Python 三元表达式,但同样不要牺牲可读性。当使用高阶函数时,Lambda 函数真正发挥作用。
总之:
- Python lambda 非常适合编写单行函数。
- 它们也用于 IIFE(立即调用的函数表达式)。
- 当有多个表达式时不应使用 Lambda,因为它会使代码不可读。
- Python 是一种面向对象的编程语言,但 lambda 是探索 Python 函数式编程的好方法。