“AttributeError:'NoneType''写''& “RuntimeWarning:overflow double_scalars” - 在一段时间内收到

时间:2014-02-03 11:39:25

标签: python python-3.x while-loop runtime-error attributeerror

我正在使用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)替换为50062len(year)的值),我仍会收到错误。

  1. 错误是否会因迭代的长度而发生? (虽然肯定不是这样)
  2. 为什么它适用于50而不是50062?
  3. 当我创造超过5万年的指数增长时,数字是否会变得太大? (我希望保留这么多年,因为我对其他具有较小lmbd值的元素使用相同的脚本,因此值不会那么大)
  4. 任何固定的可能性?
  5. 我正在使用Python 3.2

1 个答案:

答案 0 :(得分:2)

感谢 PaF 用户 eryksun 提供答案(在评论中):

  1. 我收到了关于脚本的错误警告(在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个值,将在下一个点处理。

  2. 处理overflow问题:

    • 我尝试用while替换while f<len(year) and decay[-1] != np.inf:语句(根据 PaF 建议)。一旦decay列表中的最后一个值达到inf,循环就会停止;但是,它会在列表末尾附加一个inf值。此外,overflow错误仍然存​​在。

    • 我在循环中添加了if语句,一旦到达inf但在追加到列表之前退出(但是,overflow错误仍然出现但是产生一个没有任何inf值的列表)

  3. 更新的脚本有效:

    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错误,但我认为这对我的目的来说是可以的,因为我并不担心极大的数字并且脚本会运行完成。