这两个都是 Python 的内置高阶函数(接受函数作为参数),用于处理可迭代对象(如列表、元组等),但功能不同:
1. map() 函数
作用:对可迭代对象中的每个元素应用指定函数,返回处理后的新迭代器。
语法:
map(function, iterable)
特点:
不会修改原数据,返回新迭代器
需要转换为列表/元组才能查看结果(Python 3 中返回迭代器)
函数参数可以是内置函数、lambda 或自定义函数
示例:
# 将列表元素转为平方
nums = [1, 2, 3, 4]
squared = map(lambda x: x**2, nums)
print(list(squared)) # 输出: [1, 4, 9, 16]
# 转换数据类型
str_nums = ["5", "10", "15"]
int_nums = map(int, str_nums)
print(list(int_nums)) # 输出: [5, 10, 15]
# 多个可迭代对象(并行处理)
a = [1, 2, 3]
b = [10, 20, 30]
sums = map(lambda x,y: x+y, a, b)
print(list(sums)) # 输出: [11, 22, 33]
2. filter() 函数
作用:筛选可迭代对象中满足条件的元素,返回新迭代器。
语法:
filter(function, iterable)
特点:
函数应返回布尔值(True/False)
保留使函数返回 True 的元素
函数参数为 None 时,过滤掉 “假值”(False, 0, “”, None 等)
示例:
# 筛选偶数
nums = [1, 2, 3, 4, 5, 6]
evens = filter(lambda x: x % 2 == 0, nums)
print(list(evens)) # 输出: [2, 4, 6]
# 过滤空字符串
words = ["hello", "", "world", None, " "]
valid_words = filter(None, words)
print(list(valid_words)) # 输出: ['hello', 'world', ' ']
# 自定义筛选函数
def is_positive(n):
return n > 0
mixed = [-5, 0, 3, -2, 8]
positives = filter(is_positive, mixed)
print(list(positives)) # 输出: [3, 8]
关键区别对比
| 特性 | map() | filter() |
|---|---|---|
| 目的 | 转换所有元素 | 筛选符合条件的元素 |
| 返回值 | 与输入长度相同的迭代器 | 长度 ≤ 原数据的迭代器 |
| 函数要求 | 可返回任意类型 | 必须返回布尔值 |
| 典型用途 | 类型转换、数学运算、格式处理 | 数据清洗、条件筛选、去重 |
结合使用示例
# 先筛选再转换
data = [1, "a", 2, "b", 3.5, None]
# 步骤1: 过滤出整数
integers = filter(lambda x: isinstance(x, int), data)
# 步骤2: 转换为字符串
result = map(str, integers)
print(list(result)) # 输出: ['1', '2']
现代替代方案:列表推导式
虽然 map() 和 filter() 很有用,但列表推导式通常更易读:
# 等效于 map()
squared = [x**2 for x in nums]
# 等效于 filter()
evens = [x for x in nums if x % 2 == 0]
# 组合使用
combined = [str(x) for x in data if isinstance(x, int)]
建议:
简单操作使用列表推导式
复杂逻辑或已有函数时使用 map()/filter()
处理大数据时优先用迭代器(节省内存)
1287

被折叠的 条评论
为什么被折叠?



