Подтвердить что ты не робот

Значение использования запятых и символов подчеркивания с помощью оператора назначения Python?

Чтение через Петра Норвига Решение каждого эссе Sudoku Puzzle, я столкнулся с несколькими идиомами Python, которых я никогда раньше не видел.

Я знаю, что функция может возвращать кортеж/список значений, и в этом случае вы можете назначить несколько переменных для результатов, таких как

def f():
    return 1,2

a, b = f()

Но в чем смысл каждого из следующих?

d2, = values[s]  ## values[s] is a string and at this point len(values[s]) is 1

Если len(values[s]) == 1, то как этот оператор отличается от d2 = values[s]?

Другой вопрос об использовании подчеркивания в присваивании здесь:

_,s = min((len(values[s]), s) for s in squares if len(values[s]) > 1)

Подчеркивает ли значение подчеркивания в основном отказ от первого значения, возвращаемого в списке?

4b9b3361

Ответ 1

d2, = values[s] похож на a,b=f(), за исключением распаковки 1 элемента кортежей.

>>> T=(1,)
>>> a=T
>>> a
(1,)
>>> b,=T
>>> b
1
>>> 

a является кортежем, b является целым числом.

Ответ 2

_ похоже на любое другое имя переменной, но обычно это означает, что "я не забочусь об этой переменной".

Второй вопрос: это "распаковка ценности". Когда функция возвращает кортеж, вы можете распаковать его элементы.

>>> x=("v1", "v2")
>>> a,b = x
>>> print a,b
v1 v2

Ответ 3

В оболочке Python также указывается значение последней операции. Следовательно

>>> 1
1
>>> _
1

Запятые означают распаковку. Случается, что возвращаемое значение является кортежем, и поэтому оно распаковывается в переменные, разделенные запятыми, в порядке элементов кортежа.

Ответ 4

Вы можете использовать конечную запятую в кортеже:

>>> (2,)*2
(2, 2)

>>> (2)*2
4