python - 将函数应用于可迭代对象?

标签 python algorithm function functional-programming list-comprehension

我刚刚写了这个函数:

def _apply(mols, fn, *args, **kwargs):
    return [fn(m, *args, **kwargs) for m in mols if m ]

然后我开始思考:

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

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

最佳答案

是的,你可以

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)

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

上面说明了“部分应用”,更优雅的是柯里化(Currying),即当使用比预期更少的参数调用时返回自身的部分应用版本的函数。 Python 没有内置柯里化(Currying),但作为装饰器很容易实现(参见 https://stackoverflow.com/a/9458386/989121 ):

@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']

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

关于python - 将函数应用于可迭代对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21776538/

相关文章:

python - 将带有日期和时间的字符串转换为日期

python - 测试 Postgres-DB 的连接

algorithm - 如何以最节省空间的方式选择 DVD 的内容?

c - "warning: type defaults to ‘int’“函数实际上返回什么?

python - Django 中的多对多关系 "add-friend, remove-friend"不起作用

python - 使用 ImageDataGenerator 时 Keras 卡住

algorithm - 除了 Levenshtein 之外,用于有序词集和后续聚类的更好的距离度量

algorithm - 如何从很多页面中获取相似的文本?

c - 当我使用 printf() 函数在 C 中编写函数名时打印什么

Javascript 方法调用和打印