Wolfram mathematica Mathematica中的符号替换问题
我想定义一个符号并在函数中使用它。例如,对于定义为数字列表的IDnumbers:Wolfram mathematica Mathematica中的符号替换问题,wolfram-mathematica,symbols,substitution,Wolfram Mathematica,Symbols,Substitution,我想定义一个符号并在函数中使用它。例如,对于定义为数字列表的IDnumbers: ParallelMap[{#1, Name[#1], Age[#1]} &, IDnumbers] 使用userlist={1,Name[#1],Age[#1]}变为: ParallelMap[userlist &, IDnumbers] 它与代码中的列表本身配合得很好,但与符号配合得不好。字符串列表与指定给字符串列表的符号也会发生同样的情况。这是为什么?因为f[#]和是函数[f[#]]的简写形
ParallelMap[{#1, Name[#1], Age[#1]} &, IDnumbers]
使用userlist={1,Name[#1],Age[#1]}
变为:
ParallelMap[userlist &, IDnumbers]
它与代码中的列表本身配合得很好,但与符号配合得不好。字符串列表与指定给字符串列表的符号也会发生同样的情况。这是为什么?因为f[#]和是函数[f[#]]
的简写形式,所以您应该始终使用尾部的和来完成匿名函数,以获得一个工作函数。
在您的示例中:
userlist={#1, Name[#1], Age[#1]}&
ParallelMap[userlist, IDnumbers]
更透彻的解释:
通过使用类似于f[#]
的东西,您可以得到(在FullForm[]
中)
然而,这会被后面的&
运算符转换为函数:
In[16] := f[#]& // FullForm
Out[16]//FullForm = Function[f[Slot[1]]]
如果分两步执行此操作,&
不会计算中间变量expr
:
In[25]:= expr = f[#]//FullForm
In[26]:= expr &
Out[25]//FullForm = f[Slot[1]]
Out[26] = expr &
您可以使用Evaluate[]
强制计算expr
,然后再将其包装到函数[]
:
In[27]:= expr=f[#]//FullForm
In[28]:= Evaluate[expr]&
Out[27]//FullForm = f[Slot[1]]
Out[28] = f[Slot[1]]&
另一种方法是自己提供函数[]
包装器:
userlist={#1, Name[#1], Age[#1]}
ParallelMap[Function[userlist], IDnumbers]
个人而言,我会考虑这种糟糕的编码风格。只要习惯于总是用一个尾随的&
来完成匿名函数,就像你会给一个相应的开头(
)提供一个结尾()
)
编辑
好的,对于动态生成的匿名函数,我可以理解为什么不能直接提供&
。只需在函数[]
中用槽[]
来包装表达式。如何在列表括号外添加一个符号?下面是定义userlist的代码,其中hd类似于{“ID”、“Name”、“Age”}
:lll=StringReplace[ToString@hd,“,”->“@#,”];llo=StringReplace[ToString@lll,“ID@”->”];llj=StringDrop[llo,1];llm=StringReplacePart[llj,“@#”,-1];llx=StringSplit[llm,”];llk=StringReplace[llx,“->”];用户列表=ToExpression@llk
很抱歉格式错误!请使用userlist=Function@ToExpression@llk
用于最后一步。当我在函数[]
中包装用户列表时(ParallelMap[函数[userlist]…
)userlist
的元素未被计算。它们被正确地分隔成各自的行和列,但它们仍然读取Age[#1]
,例如。。。?
userlist={#1, Name[#1], Age[#1]}
ParallelMap[Function[userlist], IDnumbers]