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 在TkinterwxPythonKivy等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

语句和表达式的区别

开发人员之间的一个常见混淆点是在编程中区分语句和表达式。

语句是做某事或执行某项操作(例如ifwhile条件)的任何代码段。

表达式由变量、值和运算符的组合组成,并计算出一个新值。

当我们探索 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 函数式编程的好方法。

Python中Lambda函数的使用 相关

了解Python正则表达式函数

什么是Python以及其用途

优惠券