Ответ 1
d2, = values[s]
похож на a,b=f()
, за исключением распаковки 1 элемента кортежей.
>>> T=(1,)
>>> a=T
>>> a
(1,)
>>> b,=T
>>> b
1
>>>
a
является кортежем, b
является целым числом.
Чтение через Петра Норвига Решение каждого эссе 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)
Подчеркивает ли значение подчеркивания в основном отказ от первого значения, возвращаемого в списке?
d2, = values[s]
похож на a,b=f()
, за исключением распаковки 1 элемента кортежей.
>>> T=(1,)
>>> a=T
>>> a
(1,)
>>> b,=T
>>> b
1
>>>
a
является кортежем, b
является целым числом.
_
похоже на любое другое имя переменной, но обычно это означает, что "я не забочусь об этой переменной".
Второй вопрос: это "распаковка ценности". Когда функция возвращает кортеж, вы можете распаковать его элементы.
>>> x=("v1", "v2")
>>> a,b = x
>>> print a,b
v1 v2
В оболочке Python также указывается значение последней операции. Следовательно
>>> 1
1
>>> _
1
Запятые означают распаковку. Случается, что возвращаемое значение является кортежем, и поэтому оно распаковывается в переменные, разделенные запятыми, в порядке элементов кортежа.
Вы можете использовать конечную запятую в кортеже:
>>> (2,)*2
(2, 2)
>>> (2)*2
4