Остановка генератора в первом ответе, вместо этого используйте return - PullRequest
0 голосов
/ 24 июля 2010

Я использую слишком много на мой вкус шаблона (после каждого возможного решения поисковой ветки).Это код для поиска слов в заданном квадрате.У него была ошибка, если слова не были предварительно выбраны, чтобы включать только те, чьи пары букв являются соседями, что я исправил сейчас, изменив сравнение вместо 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,)

Ответы [ 2 ]

3 голосов
/ 24 июля 2010

Почему вы вообще делаете это генератором, когда вам нужен только один ответ?Просто найдите ответы и верните первый вместо того, чтобы дать его.

1 голос
/ 24 июля 2010
return iter([anwser])
...