将函数应用于可迭代?

mno*_*tka 1 python algorithm functional-programming list-comprehension function

我刚刚写了这个函数:

def _apply(mols, fn, *args, **kwargs):
    return [fn(m, *args, **kwargs) for m in mols if m ]
Run Code Online (Sandbox Code Playgroud)

我开始思考:

  1. 可以使用 重写吗map
  2. 这已经在Python的某个地方实现了吗?

据我所知,map无法将参数传递给函数,另一方面,它可能会以某种方式进行优化,并且使用一些部分绑定或 lambda 我可以使用map. 这会有好处吗?

geo*_*org 6

是的你可以

from functools import partial

clean = partial(filter, None)

def _apply(mols, fn, *args, **kwargs):
    f = partial(fn, *args, **kwargs)
    return map(f, clean(mols))

def foo(m, a, b, c=123):
    return [m, a, b, c]

print _apply([11,22,'',33], foo, 'aa', 'bb', c=475)
Run Code Online (Sandbox Code Playgroud)

(在python2中,考虑itertools.imap/ifilter而不是map/filter避免临时列表)。

上面说明了“部分应用”,更优雅的是柯里化,即当使用比预期更少的参数调用时,函数返回自身的部分应用版本。Python 没有内置柯里化,但它很容易作为装饰器实现(请参阅/sf/answers/662087051/):

@curry
def join_three(a,b,c):
    return '%s-%s-%s' % (a,b,c)

mols = [11,22,33]
print map(join_three('aa', 'bb'), mols)
# prints ['aa-bb-11', 'aa-bb-22', 'aa-bb-33']
Run Code Online (Sandbox Code Playgroud)

也就是说,函数式风格在 Python 中是不受欢迎的,在大多数情况下,推导式和生成器更“Pythonic”。