Подчеркивать _ как имя переменной в 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 очень хорошая. Рекомендуемое чтение.

Другие вопросы по тегам