Interruzione del generatore in prima risposta, usa invece di ritorno
-
28-09-2020 - |
Domanda
Sto usando troppo per il mio gusto il modello (dopo ogni possibile ramo della soluzione della ricerca).Questo è il codice per trovare parole Boggle in Dato Square.Aveva un bug se le parole non sono preselette per includere solo quelle le cui coppie di lettere sono vicini, che ho riparato ora cambiando la commissioni non POS per POS non è.
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
.
C'è un'alternativa migliore per rendere il generatore che si ferma dopo che qualsiasi risposta è stata trovata?
Soluzione basata sul perché non utilizzare il rendimento
Alla fine mi ha portato e restituito la sequenza è iteratore, non importa che fosse restituito non ha prodotto valore.Così ho cambiato il mio codice word_path per usare il ritorno e ripulire le espressioni in generale.Invece di dare nessuno o falso la funzione restituisce (false,).Quindi non ho problemi senza non accettato per la dichiarazione.
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,)
. Soluzione
Perché lo fai un generatore in primo luogo quando vuoi solo una risposta?Basta cercare risposte e restituire il primo invece di renderlo.
Altri suggerimenti
return iter([anwser])
.