73 votes

Souligner _ comme nom de variable en Python

Peter Norvig a un texte décrivant un programme pour résoudre les puzzles de sudoku, même les plus difficiles, en combinant déterministe des opérations logiques et intelligents de la traversée de la solutions possibles. Celui-ci est réalisé de manière récursive; voici que la fonction (source):

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]
            )

(J'ai ajouté des espaces, des CRs, et des onglets pour le plaisir de mes yeux; des excuses à M. Norvig.)

Juste en dessous du commentaire il y a une ligne commençant par "_,s". Qui semble être l'déballé n-uplet (len(values[s]),s) à la valeur minimale de l' s. Est Dr Norvig à l'aide de "_" comme un nom de variable juste pour indiquer qu'il est un "don't care", ou quelque chose d'autre à faire? Quelles sont les situations où "_" est recommandé qu'un nom de variable? En mode interactif, "_" détient la réponse de l'opération précédente; est-il une fonction similaire dans les non-interactive code?

Mise à jour

Merci pour les bonnes réponses. Je suppose que La Réponse va à Alex Martelli pour "valeur ajoutée"; il souligne que le "_, vbl_of_interest" l'idiome est souvent un effet secondaire de la DSU idiome, qui lui-même a été faite en grande partie inutiles.

76voto

Alex Martelli Points 330805

Yep, _ est un nom traditionnel de "don't care" (qui, malheureusement, des affrontements avec l'utilisation de l'I18N, mais c'est une question distincte;-). BTW, aujourd'hui, dans Python, au lieu de:

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

vous pouvez coder

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

(ne savez pas quelle version de Python Pierre a été écrit, mais le langage qu'il utilise est un exemple de "décorer-tri-undecorate" [[UAD]] à l'exception de avec min au lieu de tri, et aujourd'hui Python key= paramètre optionnel est généralement la meilleure façon de le faire UAD;-).

13voto

mikej Points 30224

Votre interprétation est correcte. En dehors de la signification spéciale en mode interactif, _ est simplement utilisé en tant que nom de variable "indifférent", en particulier lors de la décompression.

9voto

Stephan202 Points 27707

Vous avez raison. En mode non interactif, _ n'a aucune signification particulière. En effet, Norvig veut juste dire qu'il se fiche de la valeur de cette variable.

Offtopic: Cet article de Norvig est très agréable. Une lecture recommandée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X