У Питера Норвига есть эссе, описывающее программу для решения головоломок судоку, даже самых сложных, путем объединения детерминированных логических операций и умного обхода возможные решения. Последнее выполняется рекурсивно; здесь эта функция (источник):
def search(values):
"Using depth-first search and propagation, try all possible values."
if values is False:
return False ## Failed earlier
if all( len( values[s]) == 1 for s in squares):
return values ## Solved!
## Chose the unfilled square s with the fewest possibilities
_,s = min( (len( values[s]), s)
for s in squares
if len(values[s]) > 1
)
return some( search( assign( values.copy(), s, d))
for d in values[s]
)
(Я добавил некоторые пробелы, CR и вкладки ради моих глаз, извинения доктору Норвигу.)
В правой части комментария есть строка, начинающаяся с "_,s
". Кажется, это распакованный кортеж (len(values[s]),s
) с минимальным значением s
. Является ли д-р Норвиг "_
" как имя переменной, чтобы указать на результат "не заботясь" или что-то еще происходит? Существуют ли случаи, когда "_
" рекомендуется в качестве имени переменной? В интерактивном режиме "_
" содержит ответ предыдущей операции; есть ли аналогичная функция в неинтерактивном коде?
Update
Спасибо за хорошие ответы. Я думаю, что Ответ идет Alex Martelli за "добавленную стоимость"; он указывает, что идиома "_, vbl_of_interest" часто является побочным эффектом идиомы DSU, что само по себе было в значительной степени ненужным.