27python的匿名函数与map函数/filter函数/reduce函数

基本

在 Python 中,可以使用 lambda 关键字来创建匿名函数。这些函数不需要名字,因为它们通常只使用一次。

下面是一个例子:

lambda x: x**2

这是一个计算平方的匿名函数。它接受一个参数 x,并返回 x 的平方。

你可以将这个函数赋值给一个变量,然后像调用普通函数一样调用它:

codesquare = lambda x: x**2
print(square(5))  # prints 25

匿名函数的一个常见用途是作为另一个函数的参数。例如,你可以使用 sorted 函数来按照某个特定的标准对列表进行排序,而不是按照默认的字典序。你可以使用匿名函数作为 key 参数来指定排序标准:

odeitems = [("product1", 10), ("product2", 9), ("product3", 11)]
items.sort(key=lambda x: x[1])  # sort by price
print(items)  # prints [('product2', 9), ('product1', 10), ('product3', 11)]

匿名函数也可以和其他函数一起使用,例如 map 函数。下面是一个例子,使用 map 和匿名函数来对一个数字列表进行平方:

codenumbers = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # prints [1, 4, 9, 16]

总之,匿名函数是一种简单的方法来定义一个函数,通常只在当前上下文中使用一次。



map函数也是Python中常用的内置函数之一,下面我们从三个方面介绍:什么是map函数,什么时候用map函数,以及怎么用map函数。此处参考

  1. 什么是map函数?

map是python内置函数,会根据提供的函数对指定的序列做映射。map()函数的格式是:

 map(function,iterable,...) 

(1)参数

  • function是一个函数名称,通过该函数对后续参数iterable进行处理
  • iterable是一个可迭代对象,比如:字符串、列表、字典、元组、集合等

(2)返回值

map函数通过将指定的function函数依次作用在给定序列iterable中的每一个元素上,得到一个新的list并返回。注意,map不改变原list,而是返回一个新list。

  • Python2.x 返回列表
  • Python3.x 返回生成器
  1. 什么时候用map函数?

当需要对序列进行某些操作或者处理,将其转换为新的列表时,用map函数是最合适不过了。当然,除了最基本的用法,map函数还有一些特殊的使用技巧,比如:可以进行类型转换(将元组或字符串转换为列表,因为map的返回值是列表),可以提取字典中的key等。

  1. 如何使用map函数?

(1)基本用法:

>>> def interest(x):

(2)可以在function处使用匿名函数lambda:

>>> list(map(lambda x, y: (x ** y, x+y), [2, 4, 6], [3, 2,1]))
返回值:[(8, 5), (16, 6), (6, 7)]

(3)map函数还可以用来进行类型转换

  • 将元组转换为列表
>>> list(map(int, (1, 2, 3)))
返回值:[1, 2, 3]
  • 将字符串转换为列表
>>> list(map(int,'1234'))
返回值:[1, 2, 3, 4]

(4)可以提取字典中的key

>>> list(map(int,{'1':2,'2':3,'3':4}))
返回值:[1, 2, 3]

其它

map

map 是一个内置的 Python 函数,用于将一个函数应用到一个可迭代对象(如列表、元组等)的每个元素,并返回包含结果的新可迭代对象。这是 map 函数的基本语法:

map(function, iterable, ...)
  • function 是要应用于每个元素的函数。
  • iterable 是要迭代的对象,通常是一个列表或元组,但也可以是其他可迭代对象。

map 函数会返回一个 map 对象,你可以将其转换为列表或其他数据类型以查看或进一步处理结果。

以下是一个示例,演示如何使用 map 函数将一个函数应用于列表中的每个元素:

# 定义一个函数,将数字加倍
def double(x):
    return x * 2

# 创建一个列表
numbers = [1, 2, 3, 4, 5]

# 使用 map 将 double 函数应用于列表中的每个元素
doubled_numbers = map(double, numbers)

# 将 map 对象转换为列表
doubled_numbers_list = list(doubled_numbers)

# 输出结果
print(doubled_numbers_list)  # 输出 [2, 4, 6, 8, 10]

在这个示例中,我们定义了一个函数 double,它将输入的数字加倍。然后,我们使用 map 函数将 double 函数应用于 numbers 列表中的每个元素,最后将 map 对象转换为一个新的列表 doubled_numbers_list,其中包含了每个元素经过 double 函数处理后的结果。

你可以根据需要定义不同的函数来应用于 map 函数,以便对可迭代对象中的元素进行各种操作。

filter

filter 是一个内置的 Python 函数,用于过滤可迭代对象(如列表、元组等)中的元素,只保留满足某个条件的元素。以下是 filter 函数的基本语法:

filter(function, iterable)
  • function 是一个用于过滤元素的函数,该函数接受一个元素作为参数并返回一个布尔值(True 表示保留该元素,False 表示过滤掉该元素)。
  • iterable 是要过滤的可迭代对象,通常是一个列表或元组,但也可以是其他可迭代对象。

filter 函数返回一个 filter 对象,你可以将其转换为列表或其他数据类型以查看或进一步处理结果。

以下是一个示例,演示如何使用 filter 函数过滤一个列表中的元素:

# 定义一个函数,检查元素是否为偶数
def is_even(x):
    return x % 2 == 0

# 创建一个列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8]

# 使用 filter 过滤列表中的偶数
even_numbers = filter(is_even, numbers)

# 将 filter 对象转换为列表
even_numbers_list = list(even_numbers)

# 输出结果
print(even_numbers_list)  # 输出 [2, 4, 6, 8]

在这个示例中,我们定义了一个函数 is_even,它检查一个数字是否为偶数。然后,我们使用 filter 函数将 is_even 函数应用于 numbers 列表中的每个元素,只保留那些返回 True 的元素,最后将 filter 对象转换为一个新的列表 even_numbers_list,其中包含了所有的偶数。

你可以根据需要定义不同的函数来用于 filter 函数,以便根据不同的条件来过滤可迭代对象中的元素。

reduce

reduce 是 Python 中的一个内置函数,用于对可迭代对象中的元素进行累积操作,从左到右逐个元素地应用指定的函数,最终返回一个累积的结果。

以下是 reduce 函数的基本语法:

functools.reduce(function, iterable[, initializer])
  • function 是一个接受两个参数的函数,用于指定累积操作。它应该接受当前的累积结果和可迭代对象中的下一个元素,并返回一个新的累积结果。
  • iterable 是要进行累积操作的可迭代对象。
  • initializer 是可选的,如果提供,它将被用作初始的累积值。如果未提供 initializer,则将使用可迭代对象的第一个元素作为初始累积值。

以下是一个示例,演示如何使用 reduce 函数计算一个列表中所有元素的累积乘积:

import functools

# 定义一个函数,用于计算累积乘积
def multiply(x, y):
    return x * y

# 创建一个列表
numbers = [1, 2, 3, 4, 5]

# 使用 reduce 计算列表中所有元素的累积乘积
result = functools.reduce(multiply, numbers)

# 输出结果
print(result)  # 输出 120 (1 * 2 * 3 * 4 * 5)

在这个示例中,我们首先导入 functools 模块,然后定义了一个函数 multiply,该函数接受两个参数并返回它们的乘积。接下来,我们使用 reduce 函数将 multiply 函数应用于 numbers 列表中的所有元素,计算它们的累积乘积,最终结果是 120。

reduce 函数在对列表中的元素进行累积操作时非常有用,你可以根据需要定义不同的累积函数来执行各种累积操作。

posted @ 2022-12-17 15:09  __username  阅读(127)  评论(0编辑  收藏  举报

本文作者:DIVMonster

本文链接:https://www.cnblogs.com/guangzan/p/12886111.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。