map() 和 filter() 的组合

Ulr*_*rdt 2 python

我只是有一个非常有趣的想法:使用生成器作为谓词和 .map() 和 filter() 之间的组合yield from。简而言之,代码如下:

def map_filter(function, iterable):
    """convert and filter a sequence"""
    for i in iterable:
        yield from function(i)
Run Code Online (Sandbox Code Playgroud)

现在,怎么回事?基本上,这是上述两个函数的组合,融合了它们的功能。实际上,仍然缺少传递附加参数的可能性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))
Run Code Online (Sandbox Code Playgroud)

这是另一个过滤奇数的例子:

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))
Run Code Online (Sandbox Code Playgroud)

最后一个,结合上面两个:

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))
Run Code Online (Sandbox Code Playgroud)

注意事项和问题:

  • 当然,第一个问题是,我是在重新发明轮子,还是这对 Python 来说是一个有用的补充(例如在 itertools 中)?
  • 这有什么问题或缺点吗?我看到的是稍微复杂的界面,但它似乎是一般序列操作的有用工具。
  • map_filter()需要一个生成器(带有yield),所以我不能使用lambda它(可以吗?)。对于非常小的过滤/映射函数,代码量会更大,但除此之外,您可能可以使用组合的过滤/映射函数编写更简洁的代码。
  • 最好的卖点之一是,您不仅可以使用map_filter()它从序列中删除元素,还可以使用它来注入其他元素。
  • 我当然愿意接受任何建议或改进。

Pet*_*ood 5

您可以定义生成器表达式:

>>> values = range(0, 10)
>>> evens = (value for value in values if not value % 2)
>>> even_squares = (even * even for even in evens)
>>> list(even_squares)
[0, 4, 16, 36, 64]
Run Code Online (Sandbox Code Playgroud)