学习Python中的高阶map()函数

1,059 阅读4分钟

Python map() Function

在Python中你可以利用的一个有用的高阶函数是**map()**函数。一个高阶函数接受一个函数和一组数据值作为参数。你传入的函数被应用于每个数据值,并返回一组结果或单个数据值。高阶函数的目的是为了方便将一个操作应用于许多不同的数据元素。在本教程中,我们将看几个例子,说明如何使用 Python 的 map() 函数来使用列表、图元和字符串进行映射。


map() 基础知识

我们可以从一个非常简单的以字符串表示的数字列表开始。这个列表有三个项目,每个都是一个字符串。

string_numbers = ['1', '2', '3']

我们的目标是将列表中的每一个字符串转换成一个实际的数字。我们知道 Python 有一个内置的 int() 函数,可以做到这一点。为了将 int() 函数应用于这个列表中的所有项目,我们可以使用 map() 函数。所以注意我们把 int() 函数作为第一个参数传给 map() 。还注意到我们把 **int**作为第一类对象,而没有用()括号调用该函数。第二个参数是iterable,它包含了函数所要应用的所有元素。

string_numbers = ['1', '2', '3']
result = map(int, string_numbers)

print(result) 
<map object at 0x000001E878B6FB20>

map()函数建立并返回一个新的map对象,我们可以从上面的输出看到。为了获得实际的数据,我们可以像这样把map对象传递给list()或tuple()函数。

string_numbers = ['1', '2', '3']
result = map(int, string_numbers)
result = list(result)

print(result)
[1, 2, 3]
string_numbers = ['1', '2', '3']
result = map(int, string_numbers)
result = tuple(result)

print(result)
(1, 2, 3)

使用map()的自定义函数

map()的好处是,你可以定义你自己的函数,可以做任何你喜欢的事情。然后,当你调用map()函数时,你可以再次将你自己的函数作为第一个参数传递。在下一个例子中,我们首先定义一个函数,检查一个字符串中的字母 "a"。如果它找到了一个字母'a',那么它就把它大写。我们将把这个自定义函数和map()函数一起用在一个字符串上,看看它是如何工作的。

def a_checker(str):
    if 'a' in str:
        return 'a'.capitalize()
    else:
        return str


result = map(a_checker, 'abracadabra')

print(list(result))
['A', 'b', 'r', 'A', 'c', 'A', 'd', 'A', 'b', 'r', 'A']

自定义函数实例二

让我们再写一个可以和map()一起使用的函数。我们想输出一个列表中任何对象的类型。所以在我们的自定义函数中,我们可以调用[type() 函数]。然后我们构造一个持有各种不同 Python 类型的列表。当我们调用 map() 函数并把我们的自定义函数传给它时,它将为我们打印出所有这些类型。

def type_checker(var):
    print(type(var))


random = ['hi', 7, 3.14, True, [1, 2], ('one', 'two'), {'key': 'val'}]

result = map(type_checker, random)

list(result)
<class 'str'>
<class 'int'>
<class 'float'>
<class 'bool'>
<class 'list'>
<class 'tuple'>
<class 'dict'>

使用 print() 和 map()

print()可能是Python语言中最常用的函数。我们可以把它和map()一起使用吗?我们当然可以。

random = ['hi', 7, 3.14, True, [1, 2], ('one', 'two'), {'key': 'val'}]

result = map(print, random)

list(result)
hi
7
3.14
True
[1, 2]
('one', 'two')
{'key': 'val'}

使用map()的巧妙技巧

def dash_printr(num):
    print('-' * num)


num_dashes = [20, 15, 10, 5, 1, 5, 10, 15, 20]

result = map(dash_printr, num_dashes)

list(result)
--------------------
---------------
----------
-----
-
-----
----------
---------------
--------------------

在map()中使用lambda

你可以使用map()函数的另一种方法是传递一个[lambda函数]作为第一个参数。lambda函数是一个没有名称的单行函数,它可以有任何数量的参数,但只能有一个表达式。人们要么喜欢它们,要么讨厌它们,但无论如何,如果你喜欢,你可以使用它们,所以我们在这里演示。

numbers = [1, 3, 7, 9, 11]

result = map(lambda num: num * 5, numbers)

print(list(result))
[5, 15, 35, 45, 55]
dogs = ['Charlie', 'Winnie', 'Mosely', 'Bella', 'Mugsy']

a_count = map(lambda word: word.count("a"), dogs)

print(list(a_count))
[1, 0, 0, 1, 0]
dogs = ['Charlie', 'Winnie', 'Mosely', 'Bella', 'Mugsy']

dog_bling = map(lambda val: val.replace("s", "$"), dogs)

print(list(dog_bling))
['Charlie', 'Winnie', 'Mo$ely', 'Bella', 'Mug$y']

Python中的高阶map()函数摘要

  • 对一个序列中的每个值应用一个函数 (比如一个列表、一个元组或一个字符串)
  • 返回一个新的结果序列
  • map() 函数建立并返回一个新的 map 对象。
  • map对象通常被传递给list()函数
  • 可以用来替代for循环
  • map对象可以直接传递给另一个map函数,对数据进行进一步的转换
  • 可以使用内置、自定义或lamda函数作为第一个参数