Usando Conditional Else em Loops em Python

Photo by AltumCode on Unsplash

Usando Conditional Else em Loops em Python

Utilizar o operador else em um loop parece loucura, mas não é impossível - pelo menos não no 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