Usando Conditional Else em Loops em Python
Tags: python, ptbr, brazil, braziliandevs
Published: 2022-10-24 21:48:57

---
title: Usando Conditional Else em Loops em Python
published: true
description: Será que é possível usar else em loops? No Python sim, é possível!
tags: #python #ptbr #brazil #braziliandevs
# cover_image: https://direct_url_to_image.jpg
# Use a ratio of 100:42 for best results.
---

Estava eu lendo o livro [CPython Internals](https://realpython.com/products/cpython-internals-book/) e depois de dar uma bisbilhotada na sintaxe da linguagem Python, eis que encontro algo assim no [arquivo `Grammar/Grammar`](https://github.com/python/cpython/blob/3.9/Grammar/Grammar#L117) (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.](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fhj6l26knd125h12770x.png)

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:

```python
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:

```python
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:

```python
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](https://gist.github.com/leonardoFiedler/249e37b0c94b293449929b03f4b5116d).

E se você quiser me acompanhar nas redes sociais, chega mais clicando [aqui](https://linktr.ee/caveiradev).

Obrigado por ler e até a próxima!

#### Fontes de Referência:

1. [CPython Internals](https://realpython.com/products/cpython-internals-book/)
2. [Geeks For Geeks: Using Else Conditional Statement With For loop in Python](https://www.geeksforgeeks.org/using-else-conditional-statement-with-for-loop-in-python/)