为什么Python中的两个while循环一个接一个(而不是在另一个内部)don';不行?
我写了下面的代码,我希望,当第一个循环结束并且没有返回False时,流将跟随第二个while循环。但是,该流跳过第二个while循环,只返回True。为什么呢?如何解决此问题,使第一个while循环之后的流转到第二个while循环为什么Python中的两个while循环一个接一个(而不是在另一个内部)don';不行?,python,while-loop,control-flow,Python,While Loop,Control Flow,我写了下面的代码,我希望,当第一个循环结束并且没有返回False时,流将跟随第二个while循环。但是,该流跳过第二个while循环,只返回True。为什么呢?如何解决此问题,使第一个while循环之后的流转到第二个while循环 square = [[1,2,3,4],[4,3,1,4],[3,1,2,4],[2,4,4,3]] # this is an auxiliary function def getSum(lis): sum = 0 for e in lis:
square = [[1,2,3,4],[4,3,1,4],[3,1,2,4],[2,4,4,3]]
# this is an auxiliary function
def getSum(lis):
sum = 0
for e in lis:
sum = sum + e
return sum
# here is where the problem is
def check_game(square):
standardSum = getSum(range(1, len(square)+1))
while square: #this is the first while loop
row = square.pop()
print row, 'row', 'sum of row=', getSum(row)
if standardSum != getSum(row):
return False
m = 0
while m < len(square): # the second while loop, which the flow skips
n = 0
col = []
while n < len(square):
col.append(square[n][m])
n = n + 1
print col, 'column'
if standardSum != getSum(col):
print standardSum, ' and sum of col =', getSum(col)
return False
m = m + 1
return True
square=[[1,2,3,4],[4,3,1,4],[3,1,2,4],[2,4,4,3]]
#这是一个辅助功能
def getSum(lis):
总和=0
对于lis中的e:
sum=sum+e
回报金额
#这就是问题所在
def检查_游戏(方形):
standardSum=getSum(范围(1,长度(平方)+1))
while square:#这是第一个while循环
row=square.pop()
打印行'row','sum of row=',getSum(row)
如果是标准金额!=getSum(行):
返回错误
m=0
whilem
第一个循环仅在方块中没有其他项目时终止。在第一个循环之后,len(square)
将是0
,因此第二个循环m
的输入条件将是False,而square:
将在square
为空时终止;因此len(square)==0
,因此m
在m=0
检查长度和增量变量时,您知道计划迭代多少次。改为使用for循环,因为它将允许您初始化增量,并在同一行上的每个循环中对其进行调整。这将避免将来导致无限循环的问题(即使这里不是问题,我认为它是指向相关的)。<> >代码>平方。POEP()/代码>从“代码>方块< /代码>返回行,并删除行,因此<代码> LeN(方)在第二个循环中为零。
还有一个内置函数sum
,其作用与getSum
函数相同。您可以使用以下函数替换第一个while来避免错误:
for row in square:
print row, 'row', 'sum of row=', getSum(row)
if standardSum != getSum(row):
return False
仅供参考,您的代码是非常(非常)非惯用的Python——它编写得更像C
这里有一个重写,它更像是Python通常编写的
square = [[1,2,3,4],[4,3,1,4],[3,1,2,4],[2,4,4,3]]
transpose = lambda i: zip(*i)
def is_magic(square):
n = len(square)
s = n*(n+1)/2
return all(sum(row) == s for row in square) and \
all(sum(col) == s for col in transpose(square))
您可能希望了解numpy
,这是一个用于处理矩阵的Python模块。有了它:
def is_magic(square):
n = len(square)
s = n*(n+1)/2
return all(m.sum(0) == s) and all(m.sum(1) == s)
检查此处的缩进是否与实际代码+1@AramKocharyan匹配:while循环实际上都不在Check_game函数内。是的,我粘贴错误,但在.py文件中,缩进正确。谢谢你,阿兰。我有点不愿意评论,因为我躺在床上打电话,但是缩进看起来对我来说不是有效的。是的,没错!我没有理解它,因为.pop()减少了正方形中的元素数量。@Pythonista'sApprentice:确保在中学习代码,这将展示如何以更具表达力、可读性和简洁性的方式编写函数。尝试理解这些代码,您可能会学到很多关于Python的知识!是的,没错!我没有得到它是因为.pop()减少了正方形中元素的数量。是的,没错!我没有得到它是因为.pop()减少了正方形中元素的数量。非常感谢你们,伙计们!好吧,我想理解这个代码。。。我已经读了5遍,想知道。。。但这还不适合我。非常感谢你,KatrieleAlex,这段美丽的代码@Pythonista'sApprentice不用担心。你应该先把头绕过去。转置
只是一个技巧。