Pergunta

Estou usando muito o padrão, ao meu gosto (após cada ramo de solução possível da pesquisa).Este é o código para encontrar palavras confusas em um determinado quadrado.Havia um bug se as palavras não fossem pré-selecionadas para incluir apenas aquelas cujos pares de letras são vizinhos, que corrigi agora alterando a comparação not pos para pos is 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

Existe alguma alternativa melhor para fazer o gerador parar após qualquer resposta ser encontrada?

Solução baseada em por que não usar return

Finalmente ele me pegou e a sequência retornada é o iterador, não importa se foi retornada e não rendeu valor.então mudei meu código word_path para usar return e limpei as expressões em geral.Em vez de fornecer None ou False, a função retorna (False).Então não tenho problemas com Nenhum não aceito para declaração.

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,)
Foi útil?

Solução

Em primeiro lugar, por que você o transforma em um gerador quando deseja apenas uma resposta?Basta procurar respostas e retornar a primeira em vez de entregá-la.

Outras dicas

return iter([anwser])
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top