首页 > 解决方案 > 关于在python中迭代函数

问题描述

我使用 Python 编写了以下代码

import numpy as np

x1=np.array([1,2,3,4])
p1=np.array([.1,.2,.3,.4])

def fun1 (x_vec,p_vec):
    x11=np.zeros(len(x_vec))
    p11=np.zeros(len(p_vec))

    for i in range (0,len(x_vec)):
        x11[i] =x_vec[i]**2
        p11[i]=x11[i]*p_vec[i]

    return x11 ,p11

第一次迭代

x2=np.array(len(x1))
p2=np.array(len(p1))

x2 ,p2 = fun1(x1,p1)

第二次迭代

x3=np.array(len(x1))
p3=np.array(len(p1))

x3 ,p3 = fun1(x1,p2)

所以在第二次迭代中,我使用 了从上一次迭代中获得的p2 。

第三次迭代

x4=np.array(len(x1))
p4=np.array(len(p1))

    x4 ,p4 = fun1(x1,p3)

    print("p",p2)
    print("x",x2)

    print("p",p3)
    print("x",x3)

    print("p",p3)
    print("x",x4)

基于此,我想要的输出是,(3次迭代)

p [0.1 0.8 2.7 6.4]
x [ 1.  4.  9. 16.]
p [1.000e-01 3.200e+00 2.430e+01 1.024e+02]
x [ 1.  4.  9. 16.]
p [1.000e-01 3.200e+00 2.430e+01 1.024e+02]
x [ 1.  4.  9. 16.]

由于上面的代码手动更新了值,我需要在 Python 中使用 for 循环或一些迭代器来做同样的事情。

由于我是 Python 新手,所以我不知道该怎么做。谁能建议一种方法来做到这一点?

标签: pythonfunctionfor-loopiterationreturn-value

解决方案


只需在循环中重新分配回相同的变量。

如果需要,您还可以跟踪列表中的所有迭代(results此处)。

import numpy as np


def fun1(x_vec, p_vec):
    x11 = np.zeros(len(x_vec))
    p11 = np.zeros(len(p_vec))

    for i in range(0, len(x_vec)):
        x11[i] = x_vec[i] ** 2
        p11[i] = x11[i] * p_vec[i]

    return x11, p11


x = np.array([1, 2, 3, 4])
p = np.array([0.1, 0.2, 0.3, 0.4])

results = [(x, p)]

for i in range(5):
    x, p = fun1(x, p)
    print(i, x, p)
    results.append((x, p))

输出

0 [ 1.  4.  9. 16.] [0.1 0.8 2.7 6.4]
1 [  1.  16.  81. 256.] [1.0000e-01 1.2800e+01 2.1870e+02 1.6384e+03]
2 [1.0000e+00 2.5600e+02 6.5610e+03 6.5536e+04] [1.00000000e-01 3.27680000e+03 1.43489070e+06 1.07374182e+08]
3 [1.0000000e+00 6.5536000e+04 4.3046721e+07 4.2949673e+09] [1.00000000e-01 2.14748365e+08 6.17673396e+13 4.61168602e+17]
4 [1.00000000e+00 4.29496730e+09 1.85302019e+15 1.84467441e+19] [1.00000000e-01 9.22337204e+17 1.14456127e+29 8.50705917e+36]

results最终成为一个 2 元组列表:

[(array([1, 2, 3, 4]), array([0.1, 0.2, 0.3, 0.4])),
 (array([ 1.,  4.,  9., 16.]), array([0.1, 0.8, 2.7, 6.4])),
 (array([  1.,  16.,  81., 256.]),
  array([1.0000e-01, 1.2800e+01, 2.1870e+02, 1.6384e+03])),
 (array([1.0000e+00, 2.5600e+02, 6.5610e+03, 6.5536e+04]),
  array([1.00000000e-01, 3.27680000e+03, 1.43489070e+06, 1.07374182e+08])),
 (array([1.0000000e+00, 6.5536000e+04, 4.3046721e+07, 4.2949673e+09]),
  array([1.00000000e-01, 2.14748365e+08, 6.17673396e+13, 4.61168602e+17])),
 (array([1.00000000e+00, 4.29496730e+09, 1.85302019e+15, 1.84467441e+19]),
  array([1.00000000e-01, 9.22337204e+17, 1.14456127e+29, 8.50705917e+36]))]

推荐阅读