我编写了下面的代码,我期待的是,当第一个循环结束并且不返回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:
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
答案 0 :(得分:5)
第一个循环仅在square
中没有剩余项目时终止。在第一个循环之后,len(square)
将为0
,因此第二个循环m < len(square)
的条目条件为False
。
答案 1 :(得分:2)
FYI你的代码非常(非常非常)非惯用的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)
答案 2 :(得分:1)
while square:
为空时, square
将终止;它遵循len(square) == 0
,因此在m < len(square)
时m=0
评估为假。
答案 3 :(得分:1)
square.pop()
从square
返回一行,删除行,因此len(square)
在第二个循环中为零。
还有一个内置函数sum
与您的getSum
函数完全相同。
答案 4 :(得分:0)
您知道计划迭代的次数,因为您检查了长度和增量变量。改为使用for循环,因为它允许您初始化增量并在同一行上调整每个循环。这将避免在将来导致无限循环的问题(尽管这不是问题,我认为这与指出相关)。
答案 5 :(得分:0)
您可以通过更换第一个来避免错误:
for row in square:
print row, 'row', 'sum of row=', getSum(row)
if standardSum != getSum(row):
return False