Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的while循环在到达break之后再执行一次?_Python - Fatal编程技术网

Python 为什么我的while循环在到达break之后再执行一次?

Python 为什么我的while循环在到达break之后再执行一次?,python,Python,我仍在学习如何编写一个适当的while循环。这个小练习要求编写一个while循环,找到小于整数限制的最大平方数,并将其存储在名为nearest_square的变量中。平方数是整数乘以自身的乘积。例如,36是一个平方数,因为它等于6*6。如果限制设置为40,代码应将最近的平方设置为36 所以我首先写了这样的代码: limit = 40 n=1 nearest_square = 1 while nearest_square < limit: nearest_square = n**

我仍在学习如何编写一个适当的while循环。这个小练习要求编写一个while循环,找到小于整数限制的最大平方数,并将其存储在名为nearest_square的变量中。平方数是整数乘以自身的乘积。例如,36是一个平方数,因为它等于6*6。如果限制设置为40,代码应将最近的平方设置为36

所以我首先写了这样的代码:

limit = 40

n=1
nearest_square = 1

while nearest_square < limit:
    nearest_square = n**2
    n += 1
    
print(nearest_square)
我不知道为什么n不是在6点休息而是在7点休息

我确实稍微编辑了我的代码,这次它在6点中断

limit = 40

n=1
nearest_square = 1

while n**2 < limit:
    nearest_square = n**2
    n += 1
    
print(nearest_square)
这次的输出是36


我不知道while循环何时中断,以及为什么在第一个代码块中,n在7处结束,然后再次返回循环,并计算49处最近的_平方,即使49已经大于40。

在第一种情况下,检查最近的_平方,以查看while循环是否应继续,但它只会在n增加后在while循环的下一次迭代中更新,所以在n达到7后,程序检查最近的_平方的值,发现它仍然是36,因为程序还没有更新它,所以在停止之前将最近的_平方更改为49,将n更改为8。在第二种情况下,您的程序在更改最近方的值之前检查n*n>40。

第一个循环中的问题是,您在超过限制后中断。当你真的想要在它之前进行计算时,你已经得到了49。您要么需要保留上一个值,要么像第二个示例一样进行两次计算。因为这是一个便宜的计算,两者都可以。但更普遍的情况是,跟踪以前的值更为常见

由于您的计数可以按范围处理,因此这可以是一个for循环

我不知道为什么不是6点而是7点

让我们从n=6手动迭代

n=6 n=7 n=8 在第一种情况下,您检查的是前一个n的最近的_平方,而不是当前的n


正如@tdelaney所提到的,您也可以在while中添加if。

原因是,在第一个循环中,最近的_平方仍然对应于6**2,尽管while决定是否再次执行块时n=7。请注意,将n**2存储在最近的_平方中后,会增加n的值

一个变量中的更改不会自动转移到使用以前调用创建的其他变量


对于while循环,这些一个接一个的问题可能很难捕捉到,所以不要感到太气馁

发生这种情况是因为它首先检查它,然后才将其平方

当您将其更改为:

limit = 40

n=1
nearest_square = 1

while n**2 < limit:
    nearest_square = n**2
    n += 1
    
print(nearest_square)
它检查平方和,然后再计算平方

另一个解决办法是:


n=1

while (n + 1) ** 2 < limit:
    n += 1
    
print(n ** 2)

很好的问题解决方法:

是的,如果我能使用for循环,我更喜欢它。For循环是一种更简单的方法,每个步骤都非常清晰。我很少使用while循环。首先是可能的无限循环,其次是我很难想象计算机在后面是如何运行的。谢谢你的解释。我确实核对了答案。聪明的方法是定义while循环中最近的_square=n**2。可能会阻止它更新。@Yi.D若要执行此操作,您需要将最近方定义为一个函数,如def nearest_square:return n**2。整型变量不会改变,即使用来计算它们的变量改变了;这样工作的唯一变量是包含对其他变量的引用的对象;e、 g.如果列表包含一个对象作为元素,那么如果该对象的属性发生更改,使用该列表进行查找将返回更改的值,因为该列表包含对该对象的引用,而不是该对象的副本。对于数字、字符串或其他简单数据类型,情况并非如此。哇,非常感谢!你现在真的像计算机一样思考欢迎嘟嘟嘟嘟。你可以试着把流程可视化,真的很有帮助,我喜欢。已经把它加入书签了。非常感谢你的帮助!
while nearest_square < limit:  ## 25 < 40 (25, nearest_square calculated when n=5)
    nearest_square = n**2  ## nearest_square = 6**2 => 36
    n += 1  ## n =7
while nearest_square < limit:  ## 36 < 40 (36, nearest_square calculated when n=6)
        nearest_square = n**2  ## nearest_square = 7**2 => 49
        n += 1  ## n = 8
while nearest_square < limit:  ## 49 < 40 (49, nearest_square calculated when n=7) 
       exit ## since condition is not met
limit = 40

n=1
nearest_square = 1

while n**2 < limit:
    nearest_square = n**2
    n += 1
    
print(nearest_square)

n=1

while (n + 1) ** 2 < limit:
    n += 1
    
print(n ** 2)