理解 Python 中的 map、filter 和 zip
理解 Python 中的 map、filter 和 zip
理解 Python 中的 map、filter 和 zip
本文的目的是了解 Python 内置函数 map()、filter() 和 zip() 的工作原理,以便您更高效地使用 Python 处理数据!
我将介绍这些功能的工作原理,并提供带有和不带有这些功能的用例进行比较。
理解这些函数的工作原理很重要,但读完本文后,你会发现一个更好的方法!它叫做“理解式” ,我在“Python 理解式入门”一文中对此进行了介绍。
地图
Python 的 map() 函数用于将函数应用于指定可迭代对象的所有元素并返回一个 map 对象。
map()
将采用 2 个必需的位置参数。1.) 针对可迭代对象运行的函数。2.) 可迭代对象(即列表)。
map(func, [...])
预期输出将是map object
具有记忆位置的。
让我们举个例子,将函数应用于square()
一个整数列表。这里的目标是从原始numbers
列表中获取一个平方数列表。
def square(number):
return number*number
numbers = [1,2,3,4,5]
没有 map()
def square(number):
return number*number
numbers = [1,2,3,4,5]
squared_numbers = []
for number in numbers:
squared = square(number)
squared_numbers.append(squared)
使用 map()
def square(number):
return number*number
numbers = [1,2,3,4,5]
squared_numbers = map(square, numbers)
我们的观察结果:
- 使用时
map()
我们不需要创建一个在 for 循环中附加的空列表。 - 我们不需要使用
square()
括号作为函数参数,因为map()
会为我们调用函数,我们只需传递函数对象。 map()
square()
将针对中的每个项目运行numbers
。
筛选
Python 的 filter() 函数检查可迭代对象中每个元素的条件,并返回仅包含符合给定条件的元素的过滤数据结构。
filter()
将采用 2 个必需的位置参数。1.) 针对可迭代对象运行的函数。2.) 可迭代对象(即列表)。
filter(func, [...])
传递给的函数filter()
必须返回布尔值(True
或False
)
预期输出将是filter object
具有记忆位置的。
让我们举个例子,将函数应用于even()
一个整数列表。这里的目标是获取一个只包含偶数的列表。
def even(number):
if (number % 2) == 0:
return True
return False
numbers = [1,2,3,4,5]
不使用过滤器()
def even(number):
if (number % 2) == 0:
return True
return False
numbers = [1,2,3,4,5]
even_numbers = []
for number in numbers:
if even(number):
even_numbers.append(number)
使用 filter()
def even(number):
if (number % 2) == 0:
return True
return False
numbers = [1,2,3,4,5]
even_numbers = filter(even, numbers)
我们的观察结果:
- 使用时
filter()
我们不需要创建一个在 for 循环中附加的空列表。 - 我们不需要使用
even()
括号作为函数参数,因为filter()
会为我们调用函数,我们只需传递函数对象。 filter()
even()
将对中的每个项目运行numbers
并删除返回的所有元素False
。
拉链
Python 的 zip() 函数将具有匹配索引的两个列表的元素组合成一个可交互的元组。
zip()
将采用未定义数量的参数,其中每个参数都是可迭代的 zip。
zip([...], [...], [...], ...)
它的预期输出将是zip object
包含每个可迭代的相同索引元素的元组以及内存位置。
让我们将上面的两个例子结合起来,创建一个偶数列表,其中包含它们各自的平方结果。
def even(number):
if (number % 2) == 0:
return True
return False
def square(number):
return number*number
numbers = [1,2,3,4,5]
even_numbers = filter(even, numbers)
even_numbers_squared = map(square, even_numbers)
不使用 zip()
...
even_numbers = [2,4]
even_numbers_squared = [4, 8]
combined = []
even_numbers_index = 0
for number in even_numbers:
squared = even_numbers_squared[even_numbers_index]
squared_tuple = (number, squared)
combined.append(squared_tuple)
使用 zip()
...
even_numbers = [2,4]
even_numbers_squared = [4, 8]
zipped_result = zip(even_numbers, even_numbers_squared)
我们的观察结果:
- 使用
zip()
我们可以将来自多个列表的值与匹配的索引组合起来,而无需创建缓冲区列表或使用 for 循环进行迭代。
结论
因此希望通过本文你能基本了解这些函数的工作原理、它们为什么有用以及它们如何帮助你编写更高效、更易读的 Python 代码!
理解这些函数的工作原理很重要,但读完本文后,你会发现一个更好的方法!它叫做“理解式” ,我在“Python 理解式入门”一文中对此进行了介绍。
文章来源:https://dev.to/codespent/understanding-map-filter-and-zip-in-python-3ifn