Подчеркивание как имя переменной в 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]
            )

(я добавил некоторые пробелы, АСБ, и вкладки, ради моих глаз; извинения доктору Норвиг.)

прямо под комментарием есть строка, начинающаяся с "_,s". Это, кажется, распакованный кортеж (len(values[s]),s) с минимальным значением s. Доктор Норвиг использует "_ "в качестве имени переменной просто указать, что это" не волнует " результат, или что-то еще происходит? Бывают ли времена, когда"_" рекомендуется в качестве имени переменной? В интерактивном режиме, "_ " содержит ответ предыдущей операции; есть ли аналогичная функция в неинтерактивном коде?

обновление

Спасибо за хорошие ответы. Я думаю, что ответ идет к Алексу Мартелли за "добавленную стоимость"; он указывает, что идиома"_, vbl_of_interest " часто является побочным эффектом идиомы DSU, которая сама по себе была сделана в значительной степени ненужный.

3 60

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 Peter писал Для, но идиома, которую он использует, является примером " decorate-sort-undecorate "[[DSU]] за исключением min вместо sort, а в сегодняшнем Python key= необязательный параметр, как правило, лучший способ делать ДСУ;-).

вы правы. В неинтерактивном режиме _ не имеет особого смысла. Действительно, Норвиг просто хочет передать, что его не волнует значение этой переменной.

Offtopic: эта статья Норвиг очень приятно. Рекомендуем прочитать.

ваша интерпретация верна. Вне специального значения в интерактивном режиме _ просто используется как имя переменной "не волнует", особенно при распаковке.