for循环中变量的抽象失败

时间:2010-01-23 14:11:29

标签: python function sudoku

我正在尝试用Python创建一个4x4数独解算器(我只是一个初学者!)并且在尝试定义一个函数来清理我的代码时,我遇到了一些我不太了解的奇怪行为。显然,这之间存在差异:

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 个答案:

答案 0 :(得分:2)

存在差异......他们因两个不同的错误而失败!

第一个给我这个错误:

  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'的表达式树将作为参数传递给函数,但实际上它是在进行函数调用之前进行评估的,并且这会因为k未定义。你可以改用它:

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

并且在函数sd内部,您可以用l(k)调用替换l。现在,两个程序都会出现相同的错误。