Подчеркивание _ как имя переменной в Python
У Питера Норвига есть эссе, описывающее программу для решения головоломок судоку, даже самых сложных, путем объединения детерминированных логических операций и умного обхода возможные решения. Последнее выполняется рекурсивно; здесь эта функция (источник):
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, что само по себе было в значительной степени ненужным.
Ответы
Ответ 1
Yep, _
- традиционное имя для "не заботясь" (к сожалению, он сталкивается с его использованием в I18N, но это отдельная проблема;-). BTW, в настоящее время Python, а не:
_,s = min( (len( values[s]), s)
for s in squares
if len(values[s]) > 1
)
вы можете указать
s = min((s for s in squares if len(values[s])>1),
key=lambda s: len(values[s]))
(не уверен, что пишет питон Питон, но идиома, которую он использует, является примером "decorate-sort-undecorate" [[DSU]], кроме как min вместо сортировки, а в сегодняшнем Python key=
необязательный параметр, как правило, лучший способ сделать DSU; -).
Ответ 2
Вы правы. В неинтерактивном режиме _
не имеет особого значения. Действительно, Норвиг просто хочет сообщить, что он не заботится о ценности этой переменной.
Offtopic: Эта статья Норвига очень приятная. Рекомендуемое чтение.
Ответ 3
Ваша интерпретация верна. Вне специального значения в интерактивном режиме _
используется как имя переменной "не заботясь", особенно при распаковке.