2012-03-11 3 views
0

Я написал код ниже, и я ожидал, что, когда первый цикл завершится и не вернет False, поток будет следовать во второй цикл while. Однако поток пропускает второй цикл while и просто возвращает True. Почему это? Как я могу исправить эту проблему, создав поток после первого цикла while во втором цикле?Почему два цикла while один за другим (а не внутри другого) в Python не работают?

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 
+2

Проверьте отступы здесь соответствует ваш фактический код –

+0

+1 @AramKocharyan: ни одно из в то время как петли на самом деле внутри check_game Funciton. –

+0

Да, я вставляю неправильно, но в моем .py файле это с правильным отступом. Спасибо, Арам. – craftApprentice

ответ

5

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

+0

Да, точно! Я не получил его из-за .pop(), который уменьшает количество элементов в квадрате. – craftApprentice

+1

@ Pythonista'sApprentice: убедитесь, что вы изучаете код в ответе [katriealalex] (http://stackoverflow.com/a/9657676/279627), в котором показано, как вы можете написать свою функцию в гораздо более выразительном, понятном и лаконичный способ. Попытайтесь понять этот код, и вы можете много узнать о Python! –

1

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

+0

Да, точно! Я не получил его из-за .pop(), который уменьшает количество элементов в квадрате. Большое вам спасибо, ребята! – craftApprentice

0

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

+0

Спасибо за мудрый совет. – craftApprentice

1

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

Существует также встроенная функция sum, которая делает то же, что и ваша функция getSum.

+0

Да, точно! Я не получил его из-за .pop(), который уменьшает количество элементов в квадрате. – craftApprentice

0

Вы можете избежать вашей ошибки, заменив первое время с этим:

for row in square: 
    print row, 'row', 'sum of row=', getSum(row) 
    if standardSum != getSum(row): 
    return False 
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) 
+0

Ну, мне нравится понимать этот код ... Я прочитал его 5 раз, чтобы получить представление ... но это еще не для меня.Большое спасибо, Katrielalex за этот красивый код! – craftApprentice

+0

@ Pythonista'sApprentice не беспокоится. Вы должны сначала обернуть голову вокруг [понимания списка] (https://en.wikipedia.org/wiki/List_comprehension#Python). «Транспортировка» - всего лишь трюк. – katrielalex