Подчеркивать _ как имя переменной в 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 и табуляции; извиняюсь перед доктором Norvig.)
Прямо под комментарием есть строка, начинающаяся с "_,s
". Кажется, это распакованный кортеж (len(values[s]),s
) с минимальным значением s
, Доктор Норвиг использует?_
"как имя переменной, просто чтобы указать, что это результат" все равно ", или что-то еще происходит? Есть ли случаи, когда"_
"рекомендуется в качестве имени переменной? В интерактивном режиме"_
"содержит ответ предыдущей операции; есть ли подобная функция в неинтерактивном коде?
Обновить
Спасибо за хорошие ответы. Я думаю, что Ответ идет к Алексу Мартелли за "добавленную стоимость"; он указывает, что идиома "_, vbl_of_interest" часто является побочным эффектом идиомы DSU, которая сама по себе была в значительной степени ненужной.
3 ответа
Ага, _
это традиционное название "пофиг" (что, к сожалению, противоречит его использованию в I18N, но это отдельная проблема;-). Кстати, в сегодняшнем 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]))
(не знаю, для какой версии Python Питер писал, но идиома, которую он использует, является примером "decorate-sort-undecorate" [[DSU]], за исключением использования min вместо sort, а в сегодняшнем Python key=
необязательный параметр, как правило, лучший способ сделать DSU;-).
Ваша интерпретация верна. За пределами особого значения в интерактивном режиме _
просто используется как имя переменной "пофиг", особенно при распаковке.
Ты прав. В неинтерактивном режиме _
не имеет особого значения. Действительно, Норвиг просто хочет сообщить, что ему не важно значение этой переменной.
Оффтоп: эта статья Norvig очень хорошая. Рекомендуемое чтение.