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:
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!
Fontes de Referência:
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.