如何将值传递给具有多个变量的给定表达式?这些变量的值放在需要传递到表达式中的列表中。
答案 0 :(得分:12)
您修改后的问题很简单,只需
f @@ {a,b,c,...} == f[a,b,c,...]
其中@@
是Apply
的简写。在内部,{a,b,c}
为List[a,b,c]
(您可以在任何表达式上使用FullForm
查看),而Apply
只是替换Head
,List
,使用新的Head
,f
,更改功能。 Apply
的操作通常不仅限于列表
f @@ g[a,b] == f[a,b]
另外,请查看<{3}}
f[Sequence[a,b]] == f[a,b]
所以,我们可以这样做
f[ Sequence @@ {a,b}] == f[a,b]
虽然迂腐似乎非常有用。
编辑:Apply
有一个可选的2 nd 参数,用于指定级别,即
Apply[f, {{a,b},{c,d}}, {1}] == {f[a,b], f[c,d]}
注意:Apply[fcn, expr,{1}]
的简写为@@@
,正如Sequence
所述,但要指定您需要使用完整功能表单的任何其他级别描述。
答案 1 :(得分:4)
其他两种方式......
使用规则替换
f /. Thread[{a,b} -> l]
(其中Thread[{a,b} -> l]
将评估为{a->1, b->2}
)
使用纯函数
Function[{a,b}, Evaluate[f]] @@ l
(其中@@
是Apply []的一种形式,Evaluate[f]
用于将函数转换为Function[{a,b}, a^2+b^2]
)
答案 2 :(得分:3)
例如,对于两个元素
f[l_List]:=l[[1]]^2+l[[2]]^2
任意数量的元素
g[l_List] := l.l
或
h[l_List]:= Norm[l]^2
所以:
Print[{f[{a, b}], g[{a, b}], h[{a, b}]}]
{a^2 + b^2, a^2 + b^2, Abs[a]^2 + Abs[b]^2}
另外两个,只是为了好玩:
i[l_List] := Total@Table[j^2, {j, l}]
j[l_List] := SquaredEuclideanDistance[l, ConstantArray[0, Length[l]]
修改
关于你的定义
f[{__}] = a ^ 2 + b ^ 2;
它有一些问题:
1)您正在定义一个常量,因为a,b
不是参数
2)您正在使用Set而不是SetDelayed定义函数,因此评估立即完成。试试这个例子
s[l_List] = Total[l]
VS。正确的方式:
s[l_List] := Total[l]
在您使用它之前仍未评估。
3)您使用的是没有名称{__}
的模式,因此您无法在表达式的右侧使用它。正确的方法可能是:
f[{a_,b_}]:= a^2+b^2;