Почему два цикла while один за другим (не внутри другого) в Python не работают? - PullRequest
0 голосов
/ 11 марта 2012

Я написал код ниже и ожидал, что, когда первый цикл завершится и не вернет 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 

Ответы [ 6 ]

5 голосов
/ 11 марта 2012

Первый цикл заканчивается только тогда, когда в square больше не осталось элементов. После первого цикла len(square) будет 0, поэтому условие входа для второго цикла m < len(square) будет False.

2 голосов
/ 11 марта 2012

К вашему сведению, ваш код очень (очень-очень-очень) не-идиоматичный 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 голос
/ 11 марта 2012

square.pop() возвращает строку из square, а удаляет строку , поэтому len(square) равно нулю во втором цикле.

Также имеется встроенная функция sum, которая выполняет ту же функцию, что и ваша getSum функция.

1 голос
/ 11 марта 2012

while square: прекратит работу, если square пусто;из этого следует, что len(square) == 0 и, следовательно, m < len(square) оценивается как ложное, когда m=0.

0 голосов
/ 11 марта 2012

Вы можете избежать своей ошибки, заменив первое время следующим:

for row in square:
  print row, 'row', 'sum of row=', getSum(row)
  if standardSum != getSum(row):
     return False
0 голосов
/ 11 марта 2012

Вы знаете, сколько раз вы планируете выполнять итерации, потому что вы проверяете длину и переменную приращения. Вместо этого используйте цикл for, поскольку он позволит вам инициализировать приращение и настроить его каждый цикл в одной строке. Это позволит избежать проблем, приводящих к бесконечным циклам в будущем (даже если это не проблема здесь, я считаю уместным указать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...