python:使用类方法迭代

Iva*_*van 0 python numpy matplotlib

我还在挖掘python,而且我的C++背景有一些东西在阻碍.例如,我有一个班级

class crack(object):

   def __init__(self, sz1,sz2):
        self.z1 = sz1
        self.z2 = sz2

   def smallz_Z(self,z,z1,z2):
       return z - 0.5*(z2-z1)

   def get_pot(self,z):
        Z = smallz_Z(z,self.z1,self.z2)

        try:
             result = np.sum(np.arange(self.n) * self.coeffs * (1.0 / (cmath.sqrt(Z - 1.0) * cmath.sqrt(Z + 1.0))) 
                        * ((Z - cmath.sqrt(Z - 1.0) * cmath.sqrt(Z + 1.0)) ** np.arange(self.n))) * (2.0 / (self.z2 - self.z1))
Run Code Online (Sandbox Code Playgroud)

我要创建一个破解元素列表,

crack_list = []
crack_list.append(crack(z1,z2)) ...
Run Code Online (Sandbox Code Playgroud)

现在我需要使用迭代器来获取所有潜在的值,例如matplotlib轮廓函数.我做不到这样的事情:

result = np.sum(crack_list.get_potential(z))
Run Code Online (Sandbox Code Playgroud)

现在我正在做'传统'的方式:

def potential_value(z, crack_list):
     potential = complex(0, 0)

     for element in crack_list:
     potential = potential + element.get_potential(z)

    return potential
Run Code Online (Sandbox Code Playgroud)

如果我使用for循环,它表示元素破解是不可迭代的.让我们说我试着

    x = np.linspace(self.x1, self.x2, self.step)
    y = np.linspace(self.y1, self.y2, self.step)
    X, Y = np.meshgrid(x, y)
    Z = X +1j*Y

    F = np.vectorize(potential_value)
Run Code Online (Sandbox Code Playgroud)

但在这里我有一个问题:

   F(Z, crack_list)

   for element in crack_list:
      TypeError: 'crack' object is not iterable
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?谢谢.

编辑:谢谢你的答案.我仍然知道列表理解,所以它仍然在打我.假设我想改变列表理解的实现,所以我将函数更改为

def potential_value(z_list, crack_list, u_flow):

return [np.sum([c.get_potential(z) for c in crack_list]) + u_flow.get_potential_no_c(z) for z in z_list]
Run Code Online (Sandbox Code Playgroud)

我现在试图同时使用两个列表推导,所以潜在的将返回一个包含所有z_list变量的所有结果的数组 - 注意z_list应该是复杂类型的列表.有没有办法在z_list中只为一个复杂的值做到这一点,而不必传递只有一个值的列表?或者我必须做某种测试?

var*_*tec 5

要迭代的对象需要有__iter__()方法,它返回一个迭代器(或序列).迭代器应该实现方法next(),它将产生元素或者raise StopIteration没有更多的元素.就如此容易.