【发布时间】:2011-03-28 14:42:50
【问题描述】:
我仍在研究 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))
我要为破解元素创建一个列表,
crack_list = []
crack_list.append(crack(z1,z2)) ...
现在我需要使用迭代器来获取所有潜在值,例如 matplotlib 轮廓函数。我不能这样做:
result = np.sum(crack_list.get_potential(z))
现在我正在做“传统”的方式:
def potential_value(z, crack_list):
potential = complex(0, 0)
for element in crack_list:
potential = potential + element.get_potential(z)
return potential
如果我使用 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)
但这里我有一个问题:
F(Z, crack_list)
for element in crack_list:
TypeError: 'crack' object is not iterable
我该怎么做?谢谢。
编辑:感谢您的回答。我还在了解列表理解,所以它仍然在击败我。假设我想更改列表理解的实现,所以我将函数更改为
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]
我现在尝试同时使用两个列表推导,因此可能会返回一个数组,其中包含所有 z_list 变量的所有结果 - 注意 z_list 应该是复杂类型的列表。有没有办法只为 z_list 中的一个复杂值做到这一点, 不必传递一个只有一个值的列表?还是我必须做一些测试?
【问题讨论】:
-
等等!您似乎正在尝试遍历裂纹对象列表而不是单个裂纹。在我看来,crack_list 不包含列表对象,而是包含单个列表对象。可以验证吗?
标签: python numpy matplotlib