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]

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 "Wait What?" colocando as mãos na cabeça e fazendo cara de dúvida.

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"

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"

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")

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

0
Subscribe to my newsletter

Read articles from Leonardo Fiedler directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Leonardo Fiedler
Leonardo Fiedler

Olá, sou Leonardo Fiedler e sou conhecido na internet popularmente como "Caveira Dev". Sou formado em Ciência da Computação (FURB), pós graduado em Data Science (FURB) e atualmente trabalho como Data Engineer na Senior Sistemas. Atuo há mais de 10 anos no mercado, passando por desenvolvimento mobile, web e dados.