在这种情况下,if代码块如何从while循环中断的地方继续?

时间:2018-09-18 18:28:21

标签: python if-statement while-loop

我完全没有任何编码经验,而且我才刚刚开始学习Python。

在约翰·古塔格(John Guttag)的书“使用Python和应用程序来理解数据的计算和编程简介”的第3章开始处,有一个代码示例:

#Find the cube root of a perfect cube
x = int(input('Enter an integer: '))
ans = 0
while ans**3 < abs(x):
    ans = ans + 1
if ans**3 != abs(x):
    print(x, 'is not a perfect cube')
else:
    if x < 0:
        ans = -ans
    print('Cube root of ' + str(x) + ' is ' + str(ans))

我很难理解的是,“ while”之外的“ if”如何从迭代中断的地方开始?如果是由于ans的最后一次迭代使它退出循环并且还满足if条件,则if条件如何对ans的值起作用,从而在循环内满足x?(ans ^ 3不等于x仅在while循环内,这部分如何工作:

 if ans**3 != abs(x):
     print(x, 'is not a perfect cube')

我真的不知道该怎么问,但这是我偷看本书中的代码之前就想到的代码,它起作用了,也许有助于阐明我的确切要求:

x=int(input('Enter an integer: '))
crx=0

while True:
    if crx**3<abs(x):
        crx=crx+1
    elif crx**3==x:
        print('The cube root of',x,'is',str(crx)+'.')
        break
    elif crx**3==-x:
        print('The cube root of',x,'is',str(-crx)+'.')
        break
    else:
        print(x,'is not a perfect cube.')
        break

在我看来,我不得不以某种方式将if代码块插入while循环中...

谢谢。

2 个答案:

答案 0 :(得分:1)

这不是if返回while循环的结果。让我们检查控制流:

x被设置为来自字符串input的整数

ans初始化为值0,即int

x = int(input('Enter an integer: '))
ans = 0

要检查某物是否具有立方根,while循环将每个大于0的整数取整并对其求立方,如果该立方小于x ,则我们将ans增加1,否则保存ans,并退出while循环。请注意,否则涵盖了该多维数据集是否大于或等于 x

while ans**3 < abs(x):
    ans = ans + 1

如果结果ans等于x,则x具有立方根。如果不是,则x不是多维数据集根。

if ans**3 != abs(x):
    print(x, 'is not a perfect cube')
else:
    if x < 0:
        ans = -ans
    print('Cube root of ' + str(x) + ' is ' + str(ans))

答案 1 :(得分:0)

用简单的术语来说-循环确保ans的值是其立方大于或等于x的最低(非负)整数。请注意以下结果:

  • 如果x是一个完美的立方体,则ans的最终值将恰好是该立方体的根(因为我们知道ans**3必须等于x
  • 如果x不是理想的立方体,则ans的最终值必须使得ans**3严格大于x。特别是,它将不等于它。

因此,计算完全是在while循环中完成的-之后,if会检查您是否计算了精确的立方根,或者是否计算了(在这种情况下,从未可能,因为x并不是一个完美的立方体)。当然,无论哪种情况,它都会向用户显示一条适当的消息。

(我刚刚看到了使用您自己的解决方案进行的编辑-是的,正如您所观察到的,它也可以正常工作。很少只有一种方法可以解决代码问题。)