这是我的代码完全一样(我正在研究数值分析作业问题):
import integration as I
from math import *
import numpy as np
problem = 4
<snip/>
elif problem == 4:
h = 0.001
X = np.linspace(0,1, 1//h+2)
def f(x):
if x==0 or x==1:
return 0
try:
return x**3/( (1-x)**5 * (e**(x/(1-x))-1) )
except OverflowError:
return 0
try:
Y = list(map(f,X))
except:
print("That failed.")
Y = list(map(f,X))
print("Integral: %s"%I.Simpsons_L(Y, h))
这是shell的输出:
>>>
That failed.
Integral: 6.49393940227
>>>
如果我没有except
子句,那么这就是我得到的错误:
Traceback (most recent call last):
File "<snip/>", line 150, in <module>
Y = list(map(f,X))
File "<snip/>", line 145, in f
return x**3/( (1-x)**5 * (e**(x/(1-x))-1) )
File "C:\Python33\lib\idlelib\PyShell.py", line 60, in idle_showwarning
file.write(warnings.formatwarning(message, category, filename,
AttributeError: 'NoneType' object has no attribute 'write'
修改1
如果我从命令行运行我的程序,这就是我得到的:
NA_homework3problems.py:145: RuntimeWarning: overflow encountered in double_scalars
return x**3/( (1-x)**5 * (e**(x/(1-x))-1) )
显然,我的问题有一个解决方法,所以这不是我问这个问题的原因。我问为什么首先出现问题。我实际上两次执行相同的功能,它第二次工作,但不是第一次。此外,如果我自己只有map
,并且如果我尝试在同一个地图上使用list
两次,那么第二个是空的,我认为这是设计的。那么,这里发生了什么?
答案 0 :(得分:3)
您之前完成的操作已将file
None
引用
在您第一次浏览地图时,正在生成例外 Warning
例如
RuntimeWarning: overflow encountered in double_scalars
您看到的异常是由于尝试打印此警告失败。
警告正常工作方式是,一旦您收到警报,警告将在会话的剩余时间内被静音
第二次运行也会触发溢出,但由于警告被禁止,因此不会尝试打印错误,因此也不会遇到pyshell错误
你应该查看你的代码,弄清楚你在做什么,并在pyshell中吹走file
变量
答案 1 :(得分:0)
我做了更多的狩猎并确定导致问题的原因。不知何故,这不是我的代码,而是numpy的。以下代码行足以在第一次但不是第二次抛出错误。
>>> import numpy
>>> 1/numpy.float64(0)
Traceback (most recent call last):
File "<pyshell#84>", line 1, in <module>
1/numpy.float64(0)
File "C:\Python33\lib\idlelib\PyShell.py", line 64, in idle_showwarning
file.write(warnings.formatwarning(message, category, filename,
AttributeError: 'NoneType' object has no attribute 'write'
>>> 1/numpy.float64(0)
inf
不知何故,sys.__stderr__
设置为None
。我已针对此问题提交了错误报告:#5289。希望它很快就能解决。