将存储在列表中的参数传递给表达式

发布于 2024-10-20 04:53:01 字数 50 浏览 1 评论 0原文

如何将值传递给具有多个变量的给定表达式?这些变量的值放置在需要传递到表达式中的列表中。

How can I pass values to a given expression with several variables? The values for these variables are placed in a list that needs to be passed into the expression.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

嘿嘿嘿 2024-10-27 04:53:01

您修改后的问题很简单,只需

f @@ {a,b,c,...} == f[a,b,c,...]

@@应用。在内部,{a,b,c}List[a,b,c](您可以通过使用 FullForm 在任何表达式上),然后应用< /code> 只是替换 HeadList,加上新的Headf,改变了功能。 Apply 的操作不限于列表,一般情况下

f @@ g[a,b] == f[a,b]

也可以看看Sequence 这样做所以

f[Sequence[a,b]] == f[a,b]

,我们可以这样做

f[ Sequence @@ {a,b}] == f[a,b]

,虽然看起来迂腐但非常有用。

编辑Apply有一个可选的第二个nd参数,用于指定级别,即

Apply[f, {{a,b},{c,d}}, {1}] == {f[a,b], f[c,d]}

注意:Apply[fcn, expr, {1}]@@@,正如所讨论的此处,但要指定任何其他级别描述,您需要使用完整的函数形式。

Your revised question is straightforward, simply

f @@ {a,b,c,...} == f[a,b,c,...]

where @@ is shorthand for Apply. Internally, {a,b,c} is List[a,b,c] (which you can see by using FullForm on any expression), and Apply just replaces the Head, List, with a new Head, f, changing the function. The operation of Apply is not limited to lists, in general

f @@ g[a,b] == f[a,b]

Also, look at Sequence which does

f[Sequence[a,b]] == f[a,b]

So, we could do this instead

f[ Sequence @@ {a,b}] == f[a,b]

which while pedantic seeming can be very useful.

Edit: Apply has an optional 2nd argument that specifies a level, i.e.

Apply[f, {{a,b},{c,d}}, {1}] == {f[a,b], f[c,d]}

Note: the shorthand for Apply[fcn, expr,{1}] is @@@, as discussed here, but to specify any other level description you need to use the full function form.

青柠芒果 2024-10-27 04:53:01

还有其他几种方法...

  1. 使用规则替换

    <代码>f /。线程[{a,b} -> l]

    (其中 Thread[{a,b} -> l] 将计算为 {a->1, b->2}) p>

  2. 使用纯函数

    函数[{a,b}, 评估[f]] @@ l

    (其中@@是Apply[]的一种形式,Evaluate[f]用于将函数转换为Function[{a,b} , a^2+b^2])

A couple other ways...

  1. Use rule replacement

    f /. Thread[{a,b} -> l]

    (where Thread[{a,b} -> l] will evaluate into {a->1, b->2})

  2. Use a pure function

    Function[{a,b}, Evaluate[f]] @@ l

    (where @@ is a form of Apply[] and Evaluate[f] is used to turn the function into Function[{a,b}, a^2+b^2])

内心荒芜 2024-10-27 04:53:01

例如,对于

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]

与正确的方法:

 s[l_List] := Total[l]  

在您使用它之前,该方法将保持未评估状态。

3) 您使用的模式没有名称 {__},因此您不能在表达式的右侧使用它。正确的方法可能是:

f[{a_,b_}]:= a^2+b^2;

For example, for two elements

f[l_List]:=l[[1]]^2+l[[2]]^2  

for any number of elements

g[l_List] := l.l

or

h[l_List]:= Norm[l]^2

So:

Print[{f[{a, b}], g[{a, b}], h[{a, b}]}]

{a^2 + b^2, a^2 + b^2, Abs[a]^2 + Abs[b]^2}  

Two more, just for fun:

i[l_List] := Total@Table[j^2, {j, l}]

j[l_List] := SquaredEuclideanDistance[l, ConstantArray[0, Length[l]]  

Edit

Regarding your definition

f[{__}] = a ^ 2 + b ^ 2;  

It has a few problems:

1) You are defining a constant, because the a,b are not parameters.
2) You are defining a function with Set, Instead of SetDelayed, so the evaluation is done immediately. Just try for example

 s[l_List] = Total[l]

vs. the right way:

 s[l_List] := Total[l]  

which remains unevaluated until you use it.

3) You are using a pattern without a name {__} so you can't use it in the right side of the expression. The right way could be:

f[{a_,b_}]:= a^2+b^2;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文