Generador de parada en la primera respuesta, use la devolución en su lugar
-
28-09-2020 - |
Pregunta
Estoy usando demasiado para mi gusto el patrón (después de cada rama de solución posible de la búsqueda).Este es el código para encontrar palabras en boggle en cuadrado dado.Tenía un error si las palabras no están preseleccionadas para incluir solo a aquellas cuyas parejas de letras son vecinos, lo que arreglé ahora cambiando a la Comarision, no POS para POS es NINGUNA.
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
¿Hay una mejor alternativa para hacer generador que se detiene después de que se encontró una respuesta?
Solución basada en por qué no usar la devolución
Finalmente, me consiguió y la secuencia devuelta es iteradora, sin importar que se haya devuelto, no se haya dado valor.Así que cambié mi código de Word_Path para usar la devolución y limpié las expresiones en general.En lugar de no dar ninguna o falsa, la función vuelve (false,).Luego, no tengo ningún problema con ninguno, no aceptado para la declaración.
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,)
Solución
¿Por qué lo convierte en un generador en primer lugar cuando solo quieres una respuesta?Solo busque respuestas y devuelva el primero en lugar de cederlo.
Otros consejos
return iter([anwser])