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:
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 > 5
ouage > 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 constanteelse
seguido por outra (:
) e depois umasuite
, que representaria uma expressãosenã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
?
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!