Arrêtez le générateur en première réponse, utilisez le retour à la place
-
28-09-2020 - |
Question
J'utilise trop à mon goût le motif (après chaque branche de solution possible de la recherche).Ceci est le code pour trouver des mots à tourbillon dans un carré donné.Il y avait un bug si les mots ne sont pas présélectionnés pour inclure uniquement ceux dont les paires de lettres sont des voisins, que je me suis fixé maintenant en changeant comparrision, pas à POS sur POS n'est pas.
def word_path(word,used=[],pos=None):
if not word:
yield False
return
else:
correct_neighbour = [neigh for p,neigh in neighbour_set
if (not pos or pos==p) and (neigh not in used) and boggle[neigh]==word[0] ]
for i in correct_neighbour:
used_copy=used[:]+[i]
if boggle[i]==word:
yield used_copy
return
else:
for solution in word_path(word[1:],used_copy,pos=i) or (False,):
if solution:
yield solution
return
Y a-t-il une meilleure alternative au générateur qui s'arrête après une réponse a été trouvée?
Solution basé sur pourquoi ne pas utiliser retour
Enfin, il m'a été conçu et la séquence renvoyée est itérateur, peu importe qu'il a été renvoyé non donné de la valeur.J'ai donc changé mon code Word_Path pour utiliser le retour et nettoyé les expressions en général.Au lieu de donner aucun ou faux la fonction renvoie (FALSE,).Ensuite, je n'ai pas de problème avec aucune non acceptée pour la déclaration.
def word_path(word,used=[],pos=None):
if word:
correct_neighbour = [neigh
for p,neigh in neighbour_set
if ((pos is None or pos==p) and
(neigh not in used) and
boggle[neigh]==word[0]
)
]
for i in correct_neighbour:
used_copy=used[:]+[i]
if len(word)==1:
if boggle[i]==word:
return (used_copy,)
else:
for solution in word_path(word[1:],used_copy,pos=i):
if solution:
return (solution,)
return (False,)
La solution
Pourquoi faites-vous un générateur en premier lieu lorsque vous ne voulez qu'une réponse?Il suffit de chercher des réponses et de renvoyer le premier au lieu de le céder.
Autres conseils
return iter([anwser])