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

问题描述 投票:1回答:2

我根本没有任何编码经验,我刚开始学习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))

我很难理解的是,“if”之外的“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

在我看来,不知何故,我不得不在while循环中插入if代码块...

先感谢您。

python if-statement while-loop
2个回答
1
投票

这不是if回到while循环的结果。让我们来看看控制流程:

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

ans初始化为值0int

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))

0
投票

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

  • 如果x是一个完美的立方体,那么ans的最终值将正是那个立方根(因为我们知道ans**3必须等于x
  • 如果x不是一个完美的立方体,那么ans的最终值必须是ans**3严格大于x。特别是,它不等于它。

所以计算纯粹是在while循环中完成的 - 在此之后,if检查你是否计算了一个精确的立方根,或者你是否计算过(在这种情况下,这是不可能的,因为x不是一个完美的立方体)。当然,在任何一种情况下,它都会向用户打印适当的消息。

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

© www.soinside.com 2019 - 2024. All rights reserved.