从旧版本的Python到Python 3的高阶函数

时间:2019-02-03 19:13:06

标签: python lambda

有人知道如何将该HOF从先前的Python版本转换为Python 3吗?

apply_each = lambda fns, args=[]: map(apply, fns, [args]*len(fns))

这来自David Mertz的《 Python中的文本处理》一书。 由于已弃用Python 3,因此我无法使用apply函数。 我试过使用func(* args,** kwargs)代替apply(func,args,kwargs),但是我遇到了这个TypeError:'float'对象是不可迭代的。 我还发现了那些说明该函数应返回的内容的注释: https://wiki.python.org/moin/TextProcessingInPython

这是我尝试的代码:

apply_each = lambda fns, args=[]: map(fns, *args)
args = [5.4, 6.3, 6.3]
print(list(apply_each(approx, args)))

1 个答案:

答案 0 :(得分:1)

您可以定义自己的.apply

>>> def apply(f, args):
...     return f(*args)
...
>>> apply_each = lambda fns, args=[]: map(apply, fns, [args]*len(fns))

或者一劳永逸:

apply_each = lambda fns, args=[]: map(lambda f, args: f(*args), fns, [args]*len(fns))

但是这是糟糕的样式,lambda的唯一优点是它是匿名的,如果您要将其分配给一个名称,则会违背目的。这是更好的样式:

def apply(f, args):
    return f(*args)

def apply_each(fns, args=()):
    return map(apply, fns, [args]*len(fns))

所以:

>>> import operator as op
>>> list(apply_each([op.add, op.sub, op.mul, op.truediv], args=[1,2]))
[3, -1, 2, 0.5]