q = np.arange(0,mt.pi,0.01)
q = q.tolist()
def qprime(q,qc):
for x in q:
if x < qc:
a = cmt.sqrt(x**2-qc**2)
return a.real
else:
return cmt.sqrt(x**2-qc**2)
qp = qprime(q, 0.8509)
我正在尝试创建一个名为“ qp”的列表。需要通过获取上一个列表“ q”,对“ q”中的每个元素进行平方,从“ q”中的每个元素中减去标量“ qc”,最后对每个元素求根来创建此列表。显然,此列表中的某些元素可能返回复数。如果发生这种情况,我只想要真实的部分。我不确定我的代码在做什么,但是它仅返回qp的单个值0.0。
有什么建议吗?
答案 0 :(得分:1)
没有理由计算是否会有虚构部分。只需返回数字的实部即可。
from cmath import sqrt
from math import pi as PI
def qprime(x, qc):
return sqrt(x**2 - qc**2).real
qp = [qprime(x, 0.8509) for x in np.arange(0, PI, 0.01)]
答案 1 :(得分:0)
基于您传递数组的事实,我想您想要这样做:
q = np.arange(0,mt.pi,0.01)
q = q.tolist()
def qprime(q,qc):
for x in q:
if x < qc:
a = cmt.sqrt(x**2-qc**2)
yield a.real
else:
yield cmt.sqrt(x**2-qc**2)
qp = [v for v in qprime(q, 0.8509)]
答案 2 :(得分:0)
return
语句退出该函数。循环结束后,应将结果附加到list
或np.array
和return
上。
q = np.arange(0, mt.pi, 0.01)
q = q.tolist()
def qprime(q, qc):
result = np.array([]) # initialize array
for x in q:
if x < qc:
a = cmt.sqrt(x**2-qc**2)
result = np.append(result, a.real)
else:
result = np.append(result, cmt.sqrt(x**2-qc**2))
return result
qp = qprime(q, 0.8509)
或者您可以通过list
理解来获得相同的结果,删除函数内部的循环,因为它毫无意义:
q = np.arange(0, mt.pi, 0.01)
q = q.tolist()
def qprime(q, qc):
if q < qc: # no need for a loop
a = cmt.sqrt(q**2-qc**2)
return a.real
else:
return cmt.sqrt(q**2-qc**2)
qp = np.array([qprime(i, 0.8509) for i in q])