DEV Community

Leonardo Fiedler
Leonardo Fiedler

Posted on

4

Usando Conditional Else em Loops em Python

Estava eu lendo o livro CPython Internals e depois de dar uma bisbilhotada na sintaxe da linguagem Python, eis que encontro algo assim no arquivo Grammar/Grammar (Branch correspondente a versão 3.9):

while_stmt: 'while' namedexpr_test ':' suite ['else' ':' suite]
for_stmt: 'for' exprlist 'in' testlist ':' [TYPE_COMMENT] suite ['else' ':' suite]
Enter fullscreen mode Exit fullscreen mode

Essas duas linhas representam a forma de se escrever as sentenças (sintaxe) dos comando while (enquanto) e for (para).
Pegando apenas a primeira linha para analisar, é possível observar a seguinte sequência:

  1. while_stmt: rótulo que indica que esta expressão é a do comando enquanto;
  2. 'while': A palavra while, em áspas simples, significa uma constante (o que faz sentido, uma vez que o comando enquanto em Python começa com a palavra while);
  3. namedexpr_test: Aponta para um rótulo onde será definido um ou mais testes com resultado booleano. Exemplo: value > 5 ou age > 18;
  4. ':': Ao final da expressão, deve-se colocar ':' (semelhante ao { de algumas outras linguagens, como Java, C e C++);
  5. suite: Rótulo que aponta para onde será definido o corpo do loop, ou seja, o que será executado toda vez que entrar no loop;
  6. ['else' ':' suite]: Esta é a parte que me chamou a atenção. Em colchetes, aparece a constante else seguido por outra (:) e depois uma suite, que representaria uma expressão senão com seu respectivo conteúdo e, como colocada em colchetes, significa que esta parte é opcional;

Depois de ler isso podemos concluir então que, tanto para o for quanto para o while, a gente pode usar um Else?

Meme do Jackie Chan dizendo

Apesar de parecer bastante estranho, sim, é verdade, e vamos ver um exemplo prático de como isso pode ser usado.

ATENÇÃO, O MINISTÉRIO DOS BONS CÓDIGOS ADVERTE: USAR MUITO ESTA TÉCNICA PODE CAUSAR SÉRIOS PROBLEMAS E BUGAR A MENTE DOS COLEGUINHAS. USE COM CUIDADO EM PROJETOS DE PRODUÇÃO!

Para demonstrar o uso desta técnica, vamos imaginar um problema: você tem uma lista de números da sorte e, baseado no número que o usuário informou, você deverá dizer se a pessoa está com sorte ou não. Ao final, deverá retornar um texto dizendo Found, caso tenho encontrado o número ou Not Found, caso contrário.

Pois bem, se formos pensar em uma solução bem simples, podemos chegar em algo como:

def find_lucky_value(value):
    lucky_lst = [1, 3, 5, 7, 9]

    # Nesta solução, usamos uma variável auxiliar
    # Atribuímos False no inicio
    has_value = False
    for i in lucky_lst:
        if value == i:
            # Caso o valor esteja na lista, atribuímos True
            has_value = True
            break

    # Fazemos a checagem aqui no return para determinar o texto de encontrou ou nao
    return "Found" if has_value else "Not Found"
Enter fullscreen mode Exit fullscreen mode

Apesar de ser uma solução bem simples e até fácil de ler, é necessário criar uma variável auxiliar para fazer essa verificação. Pensando nisso, podemos chegar na seguinte solução:

def find_lucky_value_with_else(value):
    lucky_lst = [1, 3, 5, 7, 9]

    # Nesta solução fazemos a iteração dos dados
    # Caso o valor nao seja encontrado e o break não seja alcançado
    # O Else é invocado ao final
    for i in lucky_lst:
        if value == i:
            break
    else:
        return "Not Found"

    return "Found"
Enter fullscreen mode Exit fullscreen mode

Pode parecer um pouco estranho o uso do else no for, mas ele é executado sempre que um break não é invocado dentro do laço, fazendo com que não seja necessário criar uma variável auxiliar para controlar quando uma condição é atingida dentro de um loop.

É claro que, para este problema, pensando em algo mais próximo da vida real, poderia ser resolvido em apenas uma linha:

print("Found" if value in [1, 3, 5, 7, 9] else "Not Found")
Enter fullscreen mode Exit fullscreen mode

Apesar disto, conhecer esta técnica pode ser bem interessante, principalmente quando é necessário fazer um loop e efetuar diversas verificações, resolver desta forma pode facilitar a leitura e reduzir a quantidade de variáveis.

E aí, você já conhecia essa técnica? Já usou em algum lugar?

Compartilhe com a galera se curtiu e se você quiser baixar o código completo e brincar na sua máquina, aqui tem o link.

E se você quiser me acompanhar nas redes sociais, chega mais clicando aqui.

Obrigado por ler e até a próxima!

Fontes de Referência:

  1. CPython Internals
  2. Geeks For Geeks: Using Else Conditional Statement With For loop in Python

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post

Top comments (0)

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

AWS GenAI LIVE!

GenAI LIVE! is a dynamic live-streamed show exploring how AWS and our partners are helping organizations unlock real value with generative AI.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️