Я использую слишком много на мой вкус шаблона (после каждого возможного решения поисковой ветки).Это код для поиска слов в заданном квадрате.У него была ошибка, если слова не были предварительно выбраны, чтобы включать только те, чьи пары букв являются соседями, что я исправил сейчас, изменив сравнение вместо pos на None.
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
Есть ли лучшая альтернатива, чтобы сделатьгенератор, который останавливается после того, как какой-либо ответ был найден?
Решение, основанное на том, почему бы не использовать return
Наконец, он получил меня и вернул последовательность итератор, независимо от того, был ли он возвращендоходностьпоэтому я изменил свой код word_path, чтобы использовать return, и очистил выражения в целом.Вместо того, чтобы давать None или False, функция возвращает (False,).Тогда у меня нет проблем с Ни один не принят для утверждения.
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,)