web-dev-qa-db-fra.com

Signification de l'utilisation de virgules et de traits de soulignement avec Python?

En lisant les extraits de Peter Norvig Solving Every Sudoku Puzzle , j'ai rencontré quelques idiomes Python que je n'avais jamais vus auparavant).

Je suis conscient qu'une fonction peut renvoyer un Tuple/liste de valeurs, auquel cas vous pouvez affecter plusieurs variables aux résultats, telles que

def f():
    return 1,2

a, b = f()

Mais quelle est la signification de chacun des éléments suivants?

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

Si len(values[s]) == 1, en quoi cette instruction est-elle différente de d2 = values[s]?

Une autre question sur l'utilisation d'un trait de soulignement dans l'affectation ici:

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

Le trait de soulignement a-t-il pour effet de supprimer la première valeur renvoyée dans la liste?

42
matt b

d2, = values[s] Est exactement comme a,b=f(), sauf pour décompresser les tuples de 1 élément.

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

a est Tuple, b est un entier.

38
eduffy

_ est comme n'importe quel autre nom de variable, mais cela signifie généralement "Je m'en fiche de cette variable".

Deuxième question: c'est le "déballage de valeur". Lorsqu'une fonction renvoie un Tuple, vous pouvez décompresser ses éléments.

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

Le _ dans le shell Python fait également référence à la valeur de la dernière opération.

>>> 1
1
>>> _
1

Les virgules font référence au déballage du tuple. Ce qui se passe, c'est que la valeur de retour est un Tuple, et donc elle est décompressée dans les variables séparées par des virgules, dans l'ordre des éléments du Tuple.

8
blwy10

Vous pouvez utiliser la virgule de fin dans un tuple comme ceci:

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

>>> (2)*2
4
5
Rose Perrone