не удалось абстрагировать переменную в цикле for - PullRequest
2 голосов
/ 23 января 2010

Я пытаюсь сделать решатель судоку 4x4 в Python (я только начинающий!) И, пытаясь определить функцию для некоторой очистки моего кода, я столкнулся с каким-то странным поведением, которое я не совсем понимаю , Видимо, есть разница между этим:

sudoku = "0200140000230040"

sudoku = map(lambda x: '1234' if x=='0' else x, list(sudoku))
for i in range(16):
    for j in range(4):
        if sudoku[i] == str(j+1):
            for k in range(4):
                if len(sudoku[i/4*4+k]) > 1:
                    sudoku[i/4*4+k] = sudoku[i/4*4+k].translate(None, str(j+1))
            for k in range(4):
                if len(sudoku[4*k+i%4]) > 1:
                    sudoku[4*k+i%4] = sudoku[4*k+i%4].translate(None, str(j+1))

А этот:

sudoku = "0200140000230040"

def sd(l):
    for k in range(4):
        if len(sudoku[l]) > 1:
            sudoku[l] = sudoku[l].translate(None, str(j+1))

sudoku = map(lambda x: '1234' if x=='0' else x, list(sudoku))
for i in range(16):
    for j in range(4):
        if sudoku[i] == str(j+1):
            sd(i/4*4+k)
            sd(4*k+i%4)

Странные выражения для проверки строк и столбцов (поля еще не закончены). Мне ужасно жаль тратить ваше время, если об этом уже спрашивали, но попробуйте запустить оба фрагмента кода и посмотреть, какие результаты вы получите. Заранее спасибо.

(У меня странное чувство, что на меня будут наорать. Ха.)

1 Ответ

2 голосов
/ 23 января 2010

Есть разница ... они терпят неудачу с двумя разными ошибками!

Первый дает мне эту ошибку:

  File "test.py", line 9, in <module>
    sudoku[i/4*4+k] = sudoku[i/4*4+k].translate(None, str(j+1))
TypeError: expected a character buffer object

Второй дает мне эту ошибку:

  File "test.py", line 12, in <module>
    sd(i/4*4+k)
NameError: name 'k' is not defined

Я думаю, что основная проблема заключается в том, что вы предполагаете, что дерево выражений для 'i / 4 * 4 + k' будет передано в качестве параметра функции, но на самом деле оно вычисляется до того, как будет выполнен вызов функции, и это не выполняется, к не определен. Вы можете использовать это вместо:

    sd(lambda k: i/4*4+k)

и внутри функции sd вы можете заменить l вызовами l (k). Теперь вы получаете одинаковую ошибку для обеих программ.

...