gpt4 book ai didi

language-features - 优雅地更改变量列表 : Generalization of AddTo, TimesBy 等

转载 作者:行者123 更新时间:2023-12-02 02:28:45 25 4
gpt4 key购买 nike

假设我定义了一个变量列表

{a,b,c} = {1,2,3}

如果我想将它们加倍,我可以这样做:

{a,b,c} *= 2

变量 {a,b,c} 现在计算为 {2,4,6}。如果我想对它们应用任意转换函数,我可以这样做:

{a,b,c} = f /@ {a,b,c}

如果不指定变量列表两次,你会怎么做?

(抛开我可能想要一个数组而不是一个明确命名的变量列表的反对意见。)

最佳答案

你可以这样做:

Function[Null, # = f /@ #, HoldAll][{a, b, c}]

例如,

In[1]:= 
{a,b,c}={1,2,3};
Function[Null, #=f/@#,HoldAll][{a,b,c}];
{a,b,c}

Out[3]= {f[1],f[2],f[3]}

或者,您可以在不对 f 进行硬编码的情况下执行相同的操作,而是定义一个自定义的 set 函数。如果你给它 Listable 属性,你的 foreach 循环的效果可以很容易地重现:

ClearAll[set];
SetAttributes[set, {HoldFirst, Listable}]
set[var_, f_] := var = f[var];

例子:

In[10]:= {a,b,c}={1,2,3};
set[{a,b,c},f1];
{a,b,c}

Out[12]= {f1[1],f1[2],f1[3]}

当您的 f 是 Listable 时,您可能还希望获得速度优势,这现在尤其重要,因为 M8 Compile 使用户定义的函数能够从速度方面受益于 Listabe,在一种以前只有内置函数才能做到的方式。对于这种情况(当你追求速度并且你知道 f 是 Listable 时),你需要为 set 做的就是删除 set< 的 Listable 属性.

关于language-features - 优雅地更改变量列表 : Generalization of AddTo, TimesBy 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4711320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com