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:
- 
while_stmt: rótulo que indica que esta expressão é a do comando enquanto;
- 
'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);
- 
namedexpr_test: Aponta para um rótulo onde será definido um ou mais testes com resultado booleano. Exemplo:value > 5ouage > 18;
- 
':': Ao final da expressão, deve-se colocar ':' (semelhante ao{de algumas outras linguagens, como Java, C e C++);
- 
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;
- 
['else' ':' suite]: Esta é a parte que me chamou a atenção. Em colchetes, aparece a constanteelseseguido por outra (:) e depois umasuite, que representaria uma expressãosenãocom 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?
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!
 


 
    
Top comments (0)