我只是觉得我觉得很有趣:map()和filter()之间的组合使用生成器作为谓词和yield from
。简而言之,这是代码:
def map_filter(function, iterable):
"""convert and filter a sequence"""
for i in iterable:
yield from function(i)
现在,这笔交易是什么?基本上,这是前述两个功能之间的组合,其结合了它们的功能。实际上,仍然缺少将附加参数传递给map()
的可能性,尽管这是一个小细节恕我直言,并且可以为此进行扩展。这是一个比较,生成数字的正方形:
def function(x):
return x * x
res = map(function, range(0, 10))
print(list(res))
def function(x):
yield x * x
res = map_filter(function, range(0, 10))
print(list(res))
这是另一个,过滤奇数:
def function(x):
return x % 2 == 1
res = filter(function, range(0, 10))
print(list(res))
def function(x):
if x % 2 == 1:
yield x
res = map_filter(function, range(0, 10))
print(list(res))
最后一个,结合上面两个:
def function1(x):
return x * x
def function2(x):
return x % 2 == 1
res = map(function1, filter(function2, range(0, 10)))
print(list(res))
def function(x):
if x % 2 == 1:
yield x * x
res = map_filter(function, range(0, 10))
print(list(res))
备注和问题:
map_filter()
需要一个生成器(yield
),因此我无法使用lambda
(可以吗?)。对于非常小的过滤/映射函数,因此代码量更大,但是否则您可以使用组合过滤/映射函数编写更简洁的代码。map_filter()
从序列中删除元素,还可以使用它来注入其他元素。答案 0 :(得分:2)
您可以定义生成器表达式:
>>> values = range(0, 10)
>>> evens = (value for value in values if value % 2)
>>> even_squares = (even * even for even in evens)
>>> list(even_squares)
[0, 4, 16, 36, 64]