我正在阅读Python文档,以深入了解Python语言并遇到过滤器和映射函数。我之前使用过滤器,但从未映射过,虽然我已经在SO上看到了各种Python问题。
在Python教程中阅读了它们之后,我对两者之间的区别感到困惑。例如,来自5.1.3. Functional Programming Tools:
>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
和
>>> def cube(x): return x*x*x
...
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
这些看起来与我的功能几乎完全相同,所以我进入终端以交互方式运行Python并测试了我自己的情况。我在上面的第一个和第二个实例中使用了map
,而对于第一个实例(return x % 2 != 0 and x % 3 != 0
),它返回了一个布尔值而不是数字列表。
为什么map
有时会返回一个布尔值,有时会返回实际的返回值?
有人能向我解释map
和filter
之间的区别吗?
list(map(cube, range(1, 11)))
相当于
[cube(1), cube(2), ..., cube(10)]
而列表返回
list(filter(f, range(2, 25)))
跑完后相当于result
result = []
for i in range(2, 25):
if f(i):
result.append(i)
请注意,使用map
时,结果中的项目是函数cube
返回的值。
相反,f
在filter(f, ...)
返回的值不是result
中的项目。 f(i)
仅用于确定值i
是否应保存在result
中。
在Python2中,map
和filter
返回列表。在Python3中,map
和filter
返回迭代器。在上面,list(map(...))
和list(filter(...))
用于确保结果是一个列表。
filter()
,顾名思义,过滤原始的迭代,并重新获得为True
提供的函数返回filter()
的项目。
另一方面,map()
将提供的函数应用于iterable的每个元素,并返回每个元素的结果列表。
按照你给出的例子,让我们比较它们:
>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> range(11)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> map(f, range(11)) # the ones that returns TRUE are 1, 5 and 7
[False, True, False, False, False, True, False, True, False, False, False]
>>> filter(f, range(11)) # So, filter returns 1, 5 and 7
[1, 5, 7]
python中的map
和filter
函数非常不同,因为它们的表现非常不同。让我们有一个快速的例子来区分它们。
地图功能
让我们定义一个函数,它将采用字符串参数并检查它是否以元音字母序列呈现。
def lit(word):
return word in 'aeiou'
现在让我们为此创建一个map函数并传递一些随机字符串。
for item in map(lit,['a','b','e']):
print(item)
是的,它等同于以下
lit('a') , lit('b') , lit('e')
只是它会打印
True
False
True
过滤功能
现在让我们为此创建一个filter
函数并传递一些随机字符串。
for item in filter(lit,['a','b','e']):
print(item)
顾名思义,filter
过滤原始的iterable,并重新提供为提供给过滤器函数的函数返回True的项目。
它只会打印出来
a
e
如果你觉得这很有用的话,请把它放在here以备将来参考。
过滤器 - 返回真值的位置
var_list = [10,20,0,1]
var_b = list(filter(lambda var_a : var_a*2,var_list))
print("Values are",var_b)
产量
值为[10,20,1]
Map - 返回实际结果
var_list = [10,20,0,1]
var_b = list(map(lambda var_a : var_a*2,var_list))
print("Values are",var_b)
产量
值为[20,40,0,2]
减少 - 取列表中的前2项,然后调用函数,在下一个函数调用中,前一个调用的结果将是第一个参数,列表中的第3个项将是第二个参数
from functools import *
var_list = [10,20,0,1]
var_b = list(map(lambda var_a : var_a*2,var_list))
print("Values of var_b ",var_b)
var_c = reduce(lambda a,b:a*2,var_b)
print("Values of var_c",var_c)
产量
var_b的值[20,40,0,2]
var_c的值160
filter(function,iterable)函数(指针,就像在C中一样)返回布尔类型
map(function,iterable)函数(指针,如在C中)返回例如INT
def filterFunc(x):
if x & 1 == 0:
return False
return True
def squareFunc(x):
return x ** 2
def main():
nums = [5, 2, 9, 4, 34, 23, 66]
odds = list(filter(filterFunc, nums)) # filter(function, iterable)
print(odds)
square = list(map(squareFunc, nums)) # map(function, iterable)
print(square)
if __name__ == '__main__':
main()
过滤函数用于过滤原始列表中的结果,而Map函数用于在原始列表上应用某些函数,因此生成新列表。请参阅以下示例,其中过滤器函数仅在奇数时才返回列表中的项目。下面使用Map函数返回列表中每个项目的平方。
Lambda函数:使用Lambda:Lambda定义不包含“return”语句,它始终包含返回的表达式。我们还可以在函数预期的任何地方放置lambda定义,而不必将它分配给变量。这是lambda函数的简单性。
g = lambda x: x*x*x
print(g(5))
#125
Python中的filter()函数接受函数和列表作为参数。这提供了一种优雅的方法来过滤掉序列“序列”的所有元素,函数返回True。这是一个从输入列表返回奇数的小程序:
li = [4,5,7,8,9]
final_list = list(filter(lambda x: (x%2 != 0) , li))
print(final_list)
#[5,7,9]
Python中的map()函数接受函数和列表作为参数。通过将函数应用于每个列表项来返回新列表。
li = [5, 7, 4, 9]
final_list = list(map(lambda x: x*x , li))
print(final_list)
#[25, 49, 16, 81]