27 de outubro de 2015

uso do else em Python

Muitas linguagens de programação usam o else como alternativa ao if, e só. Nesse post vamos ver como Python usa o else em outras situações.


if e else, o padrão

a = 1
if a == 1:
    print("igual")
else:
    print("diferente")

a = 3
if a == 1:
    print("igual")
else:
    print("diferente")
Resultado:
igual
diferente

while com else

O else é executado quando a condição no while retorna False.

Exemplo 1 - entra no while e no else
a = 1
while a < 3:
    print(a)
    a = a + 1
else:
    print("a não é menor que 3")
Resultado:
1
2
a não é menor que 3
Explicação: a condição foi atendida 2 vezes. Na 3ª vez ela não foi atendida, por isso o que está dentro do else foi executado.

Exemplo 2 - só entra no else
a = 1
while a > 5000:
    print("nunca vai mostrar isso")
else:
    print("a condição é falsa")
Resultado:
a condição é falsa
Explicação: a condição do while não foi atendida.

for com else

O else é executado quando o for não tem mais iterações a fazer.

Exemplo 1 - entra no for e no else
for n in [1, 2, 3]:
    print(n)
else:
    print("fim da lista")
Resultado:
1
2
3
fim da lista
Explicação: todos os itens da lista foram processados, por isso o else foi executado.

Exemplo 2 - só entra no else
for n in []:
    print(n)
else:
    print("fim da lista")
Resultado:
fim da lista
Explicação: o for não tinha iteração a fazer. Mesmo nessa condição o else é executado.

try...except com else

O else é executado quando o bloco try chega ao fim sem lançar nenhuma exceção.

Exemplo 1 - entra no try e no else
try:
    print("dentro do try")
except:
    print("dentro do except")
else:
    print("não lançou exceção")
Resultado:
dentro do try
não lançou exceção
Explicação: nenhuma exceção foi lançada dentro do try, por isso o else foi executado.


Exemplo 2 - entra no try e no except
try:
    print("dentro do try")
    a = a / 0
except:
    print("dentro do except")
else:
    print("não vai mostrar porque lançou exceção")
Resultado:
dentro do try
dentro do except
Explicação: houve uma exceção lançada dentro do try, por isso o except foi executado, mas o else não.


O break quebra tudo!


O break muda o comportamento dos loops for e while e também do try...except, evitando que o else seja executado.
Veja os exemplos abaixo:
Exemplo 1 - não entra no else do while
a = 0
while a == 0:
    print("vai sair com o break")
    break
else:
    print("nunca vai mostrar isso porque saiu com break")
Resultado:
vai sair com o break
Explicação: o break força a saída do while sem testar a condição de controle do loop. Portanto, como a condição não foi testada depois do break, ela não foi falsa, por isso o que está dentro do else não foi executado.

Exemplo 2 - não entra no else do for
for n in [1, 2, 3]:
    print(n)
    break
else:
    print("nunca vai mostrar isso porque saiu com break")
Resultado:
1
Explicação: o break forçou a saída do for sem iterar sobre todos os itens. Por isso a lista não terminou e o que está dentro do else não foi executado.

Exemplo 3 - break dentro do try pode bagunçar sua lógica!

for n in [1, 2, 3]:
    try:
        print("dentro do try")
        break
    except:
        print("dentro do except")
    else:
        print("não vai mostrar isso porque saiu com break: else do try...except")
else:
    print("não vai mostrar isso porque saiu com break: else do for")
Resultado:
dentro do try
Explicação: o break dentro do try forçou a saída do for, por isso o else do for não foi executado. Além disso, o try não chegou ao fim por causa do break, portanto o else do try...except não foi executado.

É isso. Eu não acho essa sintaxe a mais intuitiva. O uso da palavra else dá a impressão que esse trecho só é executado se não entrar nunca no loop, como acontece no try...except, que o else só é executado se o except não for, ou no caso do if. Particularmente, eu adotaria algo do tipo for...else...finally, com funcionamento similar ao try...except...else...finally.

Bem, se eu esqueci ou errei alguma coisa, complemente aí nos comentários.

Eu sou Vinicius Assef, um programador do século passado que gosta de Python, pratica Lean Development e acredita em Deus. Você pode me contactar por email ou twitter.

3 comentários:

  1. Este comentário foi removido pelo autor.

    ResponderExcluir
  2. Ótimo post sobre o uso de else em python. Curti demais. Não querendo ser enjuado, mas tem um exemplo que a condição do while é a = 0. Não seria == ao invés de = ? E tem um expect que tu escreveu excessão, nao seria exceção ? Parabéns, continue sempre nos ajudando sempre que puder.

    ResponderExcluir
  3. Muito obrigado pelas observações, Marco Antonio.

    Texto corrigido. Se ainda escapou algum ponto, avise, por favor.

    ResponderExcluir

Marcadores