我希望能够执行以下代码:
import numpy
z=numpy.zeros(4)
k="z[i-1]"
for i in range(len(b)):
z[i]=k
哪个应返回相同的输出:
z=numpy.zeros(4)
for i in range(6):
z[i]=z[i-1]
如果我执行第一个代码块,则会收到预期的错误消息:
File "<ipython-input-982-3ba4e617a74a>", line 1, in <module>
z[i]=(k)
ValueError: could not convert string to float: 'z[i-1]'
如何将字符串中的文本传递给循环以使其作为等式运行,就像字符串中的字符是手工输入一样?
答案 0 :(得分:3)
我认为您正在寻找builtin eval()
考虑:
>>> z = numpy.zeros(4)
>>> k = "10 + z[i-1]"
>>> for i in range(1, 4):
... z[i] = eval(k)
...
>>> z
array([ 0., 10., 20., 30.])
我使表达式更复杂,因此您可以看到有趣的输出。
答案 1 :(得分:1)
执行以下操作:
import numpy
z=numpy.zeros(4)
k="z[i-1]"
for i in range(len(b)):
z[i]=eval(k)
但请注意,eval可能是一个安全问题:http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
答案 2 :(得分:1)
生产代码中非常不鼓励使用eval
以外的其他内容,您可以轻松定义一个基于数组和索引返回特定项的函数:
def k(arr,idx):
return arr[idx-1]
for i in range(len(b)):
z[i]= k(z,i)
如果需要在代码中的不同位置应用此规则,则可以编辑一个函数以将该逻辑应用于所需的所有位置。