filter, map , reduece, lambda,列表推导式, 列表生成式

本文深入探讨Python中的高阶函数,包括Map、Reduce、Filter和Lambda的使用方法及应用场景,同时介绍了列表推导式和生成器表达式的区别与优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://kuanghy.github.io/2016/02/02/python-usage

Map 函数

原型:

map(function, sequence)

作用是将一个序列通过分 function 映射到另一个序列。即对可迭代对象中的每一个元素应用function方法,将结果作为 list 返回。如下所示:

>>> def add100(x):
...     return x+100
...
>>> hh = [11,22,33]
>>> map(add100,hh)
[111, 122, 133]

如果给出了额外的可迭代参数,则对每个可迭代参数中的元素‘并行’的应用‘function’。如下所示:

>>> def abc(a, b, c):
...     return a*10000 + b*100 + c
...
>>> list1 = [11,22,33]
>>> list2 = [44,55,66]
>>> list3 = [77,88,99]
>>> map(abc,list1,list2,list3)
[114477, 225588, 336699]

如果function给出的是None,自动假定一个‘identity’函数:

>>> list1 = [11,22,33]
>>> map(None,list1)
[11, 22, 33]
>>> list1 = [11,22,33]
>>> list2 = [44,55,66]
>>> list3 = [77,88,99]
>>> map(None,list1,list2,list3)
[(11, 44, 77), (22, 55, 88), (33, 66, 99)]

实际上,map 函数类似于列表解析式:

[ function(x) for x in sequence ]

Reduce 函数

原型:

reduce(function, sequence, startValue)

作用是将一个列表归纳为一个输出。具体是将一个可迭代的对象应用到一个带有两个参数的方法上,遍历这个可迭代对象,将其中的元素依次作为 function 的参数。如果给定 startValue 值,则第一次传入的是 startValue 和可迭代对象的第一个元素;如果没有给定,则传入可迭代对象的前两个参数。

>>> def foo(x, y):
...     return x + y
...
>>> l = range(1, 10)
>>> reduce(foo, l)
45
>>> reduce(foo, l, 10)
55

Filter 函数

原型:

filter(function, sequence)

作用是按照所定义的函数过滤掉列表中的一些元素。如下所示:

>>> def foo(x):
...     return x % 2 != 0
...
>>> def hoo(x):
...     if x > 5 and x < 10:
...         return x
...     
...
>>> l = range(1, 10)
>>> filter(foo, l)
[1, 3, 5, 7, 9]
>>> filter(hoo, l)
[6, 7, 8, 9]

Lambda 函数

原型:

lambda <参数>: 函数体

定义匿名函数,即函数没有具体的名称,也被称之为隐函数,主要用于实现一些简单的操作:

>>> foo = lambda x: x**2
>>> foo(2)
4
>>> foo(4)
16
>>>

列表推导式

基本形式:

[x for item in sequence <if (conditions)>]

列表推导式又称列表解析,是一个非常有用, 简单, 而且灵活的工具, 可以用来动态地创建列表。例如获得1~10中所有奇数平方的列表:

[x ** 2 for x in range(1, 10) if x % 2 == 1 ]

生成器表达式

基本语法:

(x for item in sequence <if (conditions)>)

生成器表达式是列表解析的一个扩展。列表解析的一个不足就是必要生成所有的数据, 用以创建整个列表。这可能对有大量数据的迭代器有负面效应。生成器表达式通过结合列表解析和生成器解决了这个问题。它与列表解析非常相似,而且它们的基本语法基本相同,只不过生成器表达式是被()括起来的,而不是[],它并不真正创建数字列表, 而是返回一个生成器。

>>> item = ( x ** 2 for x in range(10) if x % 2 )
>>> item
<generator object  at 0xb6900e64>
>>> for i in item:
...     print i
...     
...
1
9
25
49
81

### 结合使用 `map`、`lambda` 和列表推导式 在 Python 中,`map` 函数、`lambda` 表达式和列表推导式都是强大的工具,能够简化代码并提高效率。以下是它们的具体用法及其组合方式。 #### 使用 `map` 和 `lambda` `map` 是一种高阶函数,它接受两个参数:一个是函数对象,另一个是可迭代对象(如列表)。通过将函数应用于每一个元素,返回一个新的迭代器[^3]。 当需要快速定义简单的操作时,通常会结合 `lambda` 来实现匿名函数的功能。例如: ```python numbers = [1, 2, 3, 4, 5] # 使用 maplambda 计算平方数 squares_map_lambda = list(map(lambda x: x ** 2, numbers)) print(squares_map_lambda) # 输出: [1, 4, 9, 16, 25] ``` 上述代码中,`lambda x: x ** 2` 定义了一个匿名函数,表示输入一个数值并返回其平方值。随后,`map` 将此函数作用于 `numbers` 的每个元素上,并最终将其转化为列表形式[^3]。 #### 列表推导式的功能扩展 列表推导式提供了一种更加直观的方式来构建新列表。它可以替代许多情况下使用的 `for` 循环结构。如果希望进一步增强灵活性,则可以在其中嵌入条件语句或者调用其他函数[^1]。 对于同样的计算平方的例子,也可以这样写: ```python numbers = [1, 2, 3, 4, 5] # 使用列表推导式计算平方数 squares_list_comprehension = [x ** 2 for x in numbers] print(squares_list_comprehension) # 输出: [1, 4, 9, 16, 25] ``` 这里无需显式声明任何额外的辅助变量或循环控制逻辑;仅需按照特定模式描述目标集合即可完成任务[^2]。 #### 组合运用三者的优势 有时候单独依靠某一项技术可能无法满足需求场景下的全部要求——比如既想利用到高效简洁的数据变换能力又不想牺牲掉程序易读性的前提下怎么办呢?这时就可以考虑把这三种方法结合起来解决问题啦! 假设我们有一个字符串组成的列表,并且想要获取这些单词长度的同时过滤掉那些短于三个字符项的结果集的话: ```python words = ["apple", "banana", "cherry", "date"] # 方法一:使用 mapfilter 配合 lambda 实现 filtered_lengths_map_filter = list( map(len, filter(lambda word: len(word) >= 3, words))) print(filtered_lengths_map_filter) # 输出: [5, 6, 6] # 方法二:完全依赖列表推导式达成同样目的 filtered_lengths_list_comp = [ len(word) for word in words if len(word) >= 3] print(filtered_lengths_list_comp) # 输出: [5, 6, 6] ``` 这两种解决方案都达到了预期效果,但是后者显然更为紧凑明了,在实际开发过程中推荐优先选用这种方式除非存在性能瓶颈考量因素影响决策过程[^4]。 --- ### 总结 无论是选择哪种途径去解决具体问题都要视具体情况而定。然而无论如何搭配起来灵活应用以上提到的技术手段总能帮助开发者写出优雅高效的 pythonic code! 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值