功能中断而不打印自写错误消息

时间:2018-04-08 10:13:07

标签: python

我正在制作一个功能,可以反复测试另一个功能,以便在用户提供的容差范围内获取值。在需要更多迭代以达到给定容差范围内的情况下,我试图让它打印错误消息,但是这条消息从未打印过,我无法弄清楚原因。

from math import e

def ctrapezoidal(f,a,b,n):
    h=((b-a)/n)
    y = (h/2)*(f(a)+f(b))
    for x in range(n-1):
        p = a + ((x+1)/n)*(b-a)
        y = y + h*(f(p))
    return y

def ctrap(f,a,b,n,tol):
    for x in range(n):
        if x is 0:
            continue
        elif x is 1:
            continue
        elif x is (n-1):
            if abs((ctrapezoidal(f,a,b,x)) - (ctrapezoidal(f,a,b,(x-1)))) < tol:
                print("The integral of the function between",a,"and",b,"approximates to",ctrapezoidal(f,a,b,x),"with a tolerance of",tol)
                break
            else:
                print("The approximation needs more iterations to calculate the integral to the given tolerance.")
                   #This error never shows, even when given too few iterations to compute.
                   #The if-statement works, though, since I've tried with values
                   #of n one integer higher than the needed number of iterations.
        else:
            if abs((ctrapezoidal(f,a,b,x)) - (ctrapezoidal(f,a,b,(x-1)))) < tol:
                print("The integral of the function between",a,"and",b,"approximates to",ctrapezoidal(f,a,b,x),"with a tolerance of",tol,". This calculation took",x,"iterations.")
                break
            else:
                continue

def g(x):
    y = 2*e**(2*x) + 2*x
    return y

ctrap(g,1,5,1331,1.e-4)

这就是我所写的。最后一行中给定的n值是ctrap适当的最低值。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

问题来自

        elif x is (n-1):

当你使用is进行比较时,Python测试左侧和右侧以查看它们是否代表字面上相同的对象。例如,它可能会比较它们的内存地址。但是,具有相同数值的两个整数通常不会是同一个对象。你可以通过启动解释器并运行

来看到这一点
>>> 1331 is (1330 + 1)
False

这表明在代码中编写1331时得到的整数对象与编写1330 + 1时得到的整数对象不同,即使它们具有相同的数值。这就是你的比较失败的原因;你有不同的对象代表相同的整数,你正在测试对象相等而不是数字相等。

使用==代替测试数字相等。

>>> 1331 == (1330 + 1)
True

请注意,Python的标准实现会将整数对象缓存到256个并包含256个,因此每个值只有一个实例。因此,最多256的整数也将比较对象相等:

>>> 256 is (255 + 1)
True
>>> 257 is (256 + 1)
False
但是,你不应该依赖于此。