Peter Norvig a un essai décrivant un programme pour résoudre des puzzles sudok , même les plus difficiles, en combinant des opérations logiques déterministes et une traversée intelligente des solutions possibles. Ce dernier se fait récursivement; voici cette 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 CR et des tabulations pour le plaisir de mes yeux; excuses au Dr Norvig.)
Juste en dessous du commentaire, il y a une ligne commençant par "_,s
". Cela semble être le Tuple décompressé (len(values[s]),s
) avec la valeur minimale de s
. Le Dr Norvig utilise-t-il "_
" Comme nom de variable juste pour indiquer qu'il s'agit d'un résultat "peu importe", ou quelque chose d'autre se passe-t-il? Y a-t-il des moments où "_
" Est recommandé comme nom de variable? En mode interactif, "_
" Contient la réponse de l'opération précédente; existe-t-il une fonction similaire dans le code non interactif?
Merci pour les bonnes réponses. Je suppose que la réponse va à Alex Martelli pour la "valeur ajoutée"; il souligne que l'idiome "_, vbl_of_interest" est souvent un effet secondaire de l'idiome DSU, lui-même rendu largement inutile).
Oui, _
est un nom traditionnel pour "je m'en fiche" (qui heurte malheureusement son utilisation dans I18N, mais c'est un problème distinct ;-). BTW, dans le Python d'aujourd'hui, au lieu de:
_,s = min( (len( values[s]), s)
for s in squares
if len(values[s]) > 1
)
vous pourriez coder
s = min((s for s in squares if len(values[s])>1),
key=lambda s: len(values[s]))
(je ne sais pas pour quelle version de Python Peter écrivait, mais l'idiome qu'il utilise est un exemple de "décorer-trier-décorer" [[DSU]] sauf avec min au lieu de trier, et dans le Python le key=
le paramètre facultatif est généralement le meilleur moyen de faire le DSU ;-).
Vous avez raison. En mode non interactif _
n'a pas de signification particulière. En effet, Norvig veut juste dire qu'il ne se soucie pas de la valeur de cette variable.
Hors sujet: cet article de Norvig est très sympa. Une lecture recommandée.
Votre interprétation est correcte. En dehors de la signification spéciale en mode interactif _
est juste utilisé comme un nom de variable "ne se soucie pas", en particulier lors du déballage.