将函数的参数(即 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
作为一种更有效的方法,您可以使用 zip
和 sum
中的生成器表达式:
>>> def fee(tup):
... return sum((x-y)**2 for x,y in zip(tup,tup[1:]+(tup[0],))))
您可以结合使用 zip
、map
和 sum
:
def fee(vals):
x1 = zip(vals, vals[1:] + [vals[0]])
x2 = map(lambda t: (t[0] - t[1]) ** 2, x1)
return sum(x2)
解释:
zip(vals, vals[:-1] + [vals[0]])
将 vals
组合成一个二元组对列表。
map(lambda t: (t[0] - t[1]) ** 2, x1)
对每个二元组元素执行数学运算。
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
这是下面的函数调用,我正在尝试构造函数 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
作为一种更有效的方法,您可以使用 zip
和 sum
中的生成器表达式:
>>> def fee(tup):
... return sum((x-y)**2 for x,y in zip(tup,tup[1:]+(tup[0],))))
您可以结合使用 zip
、map
和 sum
:
def fee(vals):
x1 = zip(vals, vals[1:] + [vals[0]])
x2 = map(lambda t: (t[0] - t[1]) ** 2, x1)
return sum(x2)
解释:
zip(vals, vals[:-1] + [vals[0]])
将vals
组合成一个二元组对列表。map(lambda t: (t[0] - t[1]) ** 2, x1)
对每个二元组元素执行数学运算。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