Смысл использования запятых и подчеркивания с оператором присваивания Python? - PullRequest
40 голосов
/ 10 ноября 2009

Прочитав Питера Норвига, решающего каждое эссе головоломки Судоку , я столкнулся с несколькими идиомами 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)

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

Ответы [ 4 ]

34 голосов
/ 10 ноября 2009

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

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

a - кортеж, b - целое число.

15 голосов
/ 10 ноября 2009

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

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

>>> x=("v1", "v2")
>>> a,b = x
>>> print a,b
v1 v2
7 голосов
/ 10 ноября 2009

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

>>> 1
1
>>> _
1

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

5 голосов
/ 22 октября 2013

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

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

>>> (2)*2
4
...