我正在使用while循环来获得放射性元素的向后衰减曲线。
import numpy as np
import csv
lmbd=np.log(2)/12.43
year=list(range(-48050,2012))
f=0
decay=[]
decay.append(0.45) # concentration of sample during year of sampling
while f<len(year): # Creating the backwards decay curve sample
p=decay[f]
x=p/np.exp(-lmbd)
decay.append(x)
f=f+1
print(decay)
当我运行上面的代码时,我收到以下错误:
回溯(最近一次呼叫最后一次):文件“”,第13行,中
x=p/np.exp(-lmbd)
文件“C:\ Python32 \ lib \ idlelib \ PyShell.py”,第59行,在idle_showwarning中 file.write(warnings.formatwarning(消息,类别,文件名,
)AttributeError:'NoneType'对象没有属性'write'
但是,如果我用len(year)
替换50
,那么循环就会顺利运行。如果我将len(year)
替换为50062
(len(year)
的值),我仍会收到错误。
lmbd
值的元素使用相同的脚本,因此值不会那么大)我正在使用Python 3.2
答案 0 :(得分:2)
感谢 PaF ,用户和 eryksun 提供答案(在评论中):
我收到了关于脚本的错误警告(在IDLE中)。
如果我在cmd
中运行脚本(根据用户建议),我收到RuntimeWarning: overflow encountered in double_scalars x=p/np.exp(-lmbd)
错误。
此外,如果我将import sys, idlelib.PyShell; idlelib.PyShell.warning_stream = sys.stderr
添加到脚本中(根据 eruksun 建议),我也会在IDLE(我正在使用)中得到正确的错误。
该脚本现在可以运行完成,但是衰减列表最后有很多inf
个值,将在下一个点处理。
处理overflow
问题:
我尝试用while
替换while f<len(year) and decay[-1] != np.inf:
语句(根据 PaF 建议)。一旦decay
列表中的最后一个值达到inf
,循环就会停止;但是,它会在列表末尾附加一个inf
值。此外,overflow
错误仍然存在。
我在循环中添加了if
语句,一旦到达inf
但在追加到列表之前退出(但是,overflow
错误仍然出现但是产生一个没有任何inf
值的列表)
更新的脚本有效:
import numpy as np
import csv
import sys, idlelib.PyShell; idlelib.PyShell.warning_stream = sys.stderr
lmbd=np.log(2)/12.43
year=list(range(-48050,2012))
f=0
decay=[]
decay.append(0.45)# concentration of sample during year of sampling
while f<len(year): # Creating the backwards decay equation for each sample
p=decay[f]
x=p/np.exp(-lmbd)
if x==np.inf:
break
decay.append(x)
f=f+1
print(decay)
print("end")
虽然这仍然会在IDLE和CMD中出现overflow
错误,但我认为这对我的目的来说是可以的,因为我并不担心极大的数字并且脚本会运行完成。