当前位置:首页>python>Python高阶函数map——对序列进行映射转换

Python高阶函数map——对序列进行映射转换

  • 2026-09-02 19:22:31
Python高阶函数map——对序列进行映射转换

一、什么是高阶函数?

高阶函数 是指能接受其他函数作为参数,或者将函数作为返回值的函数。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. 1. map 返回的是迭代器,不是列表。需要转换为列表或直接迭代。
  2. 2. 当传入多个可迭代对象时,map 以最短的为准,多余的元素被忽略。
  3. 3. map 中的函数不能过于复杂,如果逻辑复杂,应使用普通函数或列表推导式。
  4. 4. 在 Python 3 中,map 返回迭代器;在 Python 2 中,map 返回列表(注意版本差异)。
  5. 5. map 与列表推导式的选择:列表推导式支持条件过滤,而 map 更简洁地应用函数。可以根据场景灵活选择。

九、总结

特性
说明
作用
对可迭代对象的每个元素应用函数
语法
map(function, iterable1, iterable2, ...)
返回值
迭代器(map 对象)
常用搭配
lambda、普通函数
多可迭代对象
并行处理,以最短的为准
与列表推导式
各有千秋,按需选择

map 是 Python 函数式编程的重要工具之一。掌握它,可以让你的代码更加简洁、高效,尤其是在数据处理场景中。希望本文能帮你彻底理解并熟练运用 map。

最新文章

随机文章