将函数的参数(即 lambda)映射到元组?

Map a function's argument, which is a lambda, to a tuple?

这是下面的函数调用,我正在尝试构造函数 fee,我需要使用函数 prog 映射元组。这样就变成了(6-7)**2 + (7-1)**2 + (1-4)**2,最后一个就是(4-6)**2。然后我将这些和 return 这个值相加 fee.

fee((6, 7, 1, 4), lambda x, y: (x-y) ** 2)

你可以玩 python built-in functions :

>>> def fee(tup):
...    return sum(map(lambda x,y:(x-y)**2,tup,tup[1:]+(tup[0],)))

演示:

>>> t=(6, 7, 1, 4)
>>> fee(t)
50

您可以使用 map 函数对成对应用 lambda 函数并对结果求和:

>>> zip(t,t[1:]+(t[0],))
[(6, 7), (7, 1), (1, 4), (4, 6)]

而不是 map 作为一种更有效的方法,您可以使用 zipsum 中的生成器表达式:

>>> def fee(tup):
...    return sum((x-y)**2 for x,y in zip(tup,tup[1:]+(tup[0],))))

您可以结合使用 zipmapsum:

def fee(vals):
    x1 = zip(vals, vals[1:] + [vals[0]])
    x2 = map(lambda t: (t[0] - t[1]) ** 2, x1)
    return sum(x2)

解释:

  1. zip(vals, vals[:-1] + [vals[0]])vals 组合成一个二元组对列表。
  2. map(lambda t: (t[0] - t[1]) ** 2, x1) 对每个二元组元素执行数学运算。
  3. sum(x2) 将 #2 的结果加在一起。

应该这样做:

from itertools import tee

try:
    from itertools import izip as zip  # Python 2
except ImportError:
    pass  # Python 3


# An itertools recipe
# https://docs.python.org/3/library/itertools.html#itertools-recipes
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)


def fee(args, func):
    last_value = func(args[-1], args[0])
    return sum(func(x, y) for x, y in pairwise(args)) + last_value


print(fee((6, 7, 1, 4), lambda x, y: (x-y) ** 2))  # 50