一、什么是高阶函数?
高阶函数 是指能接受其他函数作为参数,或者将函数作为返回值的函数。Python 中的 map、filter、sorted、reduce 等都是高阶函数。使用高阶函数可以让代码更简洁、更函数式。
二、map 函数的基本概念
map() 是 Python 内置的高阶函数,它接收一个函数和一个可迭代对象(如列表、元组、字符串等),然后将该函数依次应用到可迭代对象的每个元素上,返回一个迭代器(包含每次应用的结果)。
简单来说,map 的作用就是:对序列中的每个元素执行相同的操作,得到一个新的序列。
# 将列表中的每个元素乘以2
defdouble(x):
return x * 2
numbers = [1, 2, 3, 4, 5]
result = map(double, numbers)
print(list(result)) # [2, 4, 6, 8, 10]
三、map 的语法
map(function, iterable, ...)
- • function:一个函数,接收一个或多个参数(取决于后面有多少个可迭代对象),并对每个元素执行操作。
- • iterable:一个或多个可迭代对象(如列表、元组、字符串等)。如果传入多个可迭代对象,
function 必须能接收相应数量的参数,且 map 会并行地从每个可迭代对象中取元素,直到最短的那个结束。 - • 返回值:一个迭代器(
map 对象),需要用 list()、tuple() 等转换为具体序列,或直接迭代。
四、map 的基本用法
4.1 使用普通函数
defsquare(x):
return x ** 2
nums = [1, 2, 3, 4, 5]
squared = map(square, nums)
print(list(squared)) # [1, 4, 9, 16, 25]
4.2 使用 lambda 表达式
更常见的做法是结合 lambda 使用,使代码更紧凑。
nums = [1, 2, 3, 4, 5]
squared = map(lambda x: x ** 2, nums)
print(list(squared)) # [1, 4, 9, 16, 25]
4.3 处理多个可迭代对象
如果传入多个可迭代对象,function 必须接收相应数量的参数。map 会从每个可迭代对象中同时取一个元素,组成参数传递给函数。
a = [1, 2, 3]
b = [4, 5, 6]
result = map(lambda x, y: x + y, a, b)
print(list(result)) # [5, 7, 9]
当可迭代对象长度不一致时,map 会在最短的耗尽时停止。
a = [1, 2, 3, 4]
b = [5, 6, 7]
result = map(lambda x, y: x * y, a, b)
print(list(result)) # [5, 12, 21] (只处理了3对)
4.4 处理字符串
words = ["hello", "world", "python"]
# 转为大写
upper_words = map(str.upper, words)
print(list(upper_words)) # ['HELLO', 'WORLD', 'PYTHON']
# 也可以使用 lambda
upper_words = map(lambda w: w.upper(), words)
4.5 类型转换
# 将字符串列表转为整数
str_nums = ["1", "2", "3", "4"]
int_nums = map(int, str_nums)
print(list(int_nums)) # [1, 2, 3, 4]
五、map 返回的是迭代器
map() 返回的是一个迭代器(map 对象),它并不是一个列表。这样可以节省内存,特别适合处理大数据集。如果需要多次访问结果,可以转换为列表。
result = map(lambda x: x*2, [1, 2, 3])
print(result) # <map object at 0x...>
print(list(result)) # [2, 4, 6]
# 再次 list(result) 将得到空列表,因为迭代器已耗尽
可以使用 list()、tuple()、set() 等显式转换,或直接在 for 循环中迭代。
for val inmap(lambda x: x*2, [1, 2, 3]):
print(val)
六、map 与列表推导式的对比
列表推导式也能实现类似功能,且通常更 Pythonic。但 map 在某些情况下(特别是已有命名函数时)可能更简洁。
# 列表推导式
squared = [x**2for x in [1, 2, 3, 4, 5]]
# map
squared = list(map(lambda x: x**2, [1, 2, 3, 4, 5]))
选择建议:
- • 当操作简单且已有现成函数(如
int、str.upper)时,map 更简洁。 - • 当操作复杂或需要条件过滤时,列表推导式更清晰。
七、实战案例
7.1 数据清洗:去除字符串两端的空格
names = [" 张三 ", "李四 ", " 王五"]
cleaned = list(map(str.strip, names))
print(cleaned) # ['张三', '李四', '王五']
7.2 计算多个列表对应元素之和
sales_2023 = [100, 200, 150]
sales_2024 = [120, 210, 180]
growth = list(map(lambda x, y: y - x, sales_2023, sales_2024))
print(growth) # [20, 10, 30]
7.3 将字典列表中的某个字段提取出来
students = [
{"name": "小明", "score": 85},
{"name": "小红", "score": 92},
{"name": "小刚", "score": 78}
]
scores = list(map(lambda s: s["score"], students))
print(scores) # [85, 92, 78]
7.4 格式化输出
names = ["小明", "小红", "小刚"]
greetings = list(map(lambda n: f"你好,{n}!", names))
print(greetings) # ['你好,小明!', '你好,小红!', '你好,小刚!']
7.5 类型转换与处理混合
mixed = ["1", "2", 3, "4", 5.0]
# 将所有元素转为整数(忽略错误?这里需要处理非字符串)
converted = list(map(lambda x: int(x) ifisinstance(x, (str, int, float)) else x, mixed))
# 但实际需要更严谨,这里只是示例
print(converted) # [1, 2, 3, 4, 5]
7.6 与 filter 结合使用
numbers = [1, 2, 3, 4, 5, 6]
# 先过滤出偶数,再求平方
even_squares = list(map(lambda x: x**2, filter(lambda x: x % 2 == 0, numbers)))
print(even_squares) # [4, 16, 36]
八、注意事项
- 1. map 返回的是迭代器,不是列表。需要转换为列表或直接迭代。
- 2. 当传入多个可迭代对象时,map 以最短的为准,多余的元素被忽略。
- 3. map 中的函数不能过于复杂,如果逻辑复杂,应使用普通函数或列表推导式。
- 4. 在 Python 3 中,map 返回迭代器;在 Python 2 中,map 返回列表(注意版本差异)。
- 5. map 与列表推导式的选择:列表推导式支持条件过滤,而 map 更简洁地应用函数。可以根据场景灵活选择。
九、总结
| |
| |
| map(function, iterable1, iterable2, ...) |
| |
| |
| |
| |
map 是 Python 函数式编程的重要工具之一。掌握它,可以让你的代码更加简洁、高效,尤其是在数据处理场景中。希望本文能帮你彻底理解并熟练运用 map。