• Python
  • 04. Desvios Condicionais (if)

Indo além#

Agora que já estamos conseguindo resolver pequenos problemas usando if, vamos ir além e escrever código bom usando if. Os itens deste tópico incluem algumas construções prolixas e/ou confusas quando criamos código com expressões booleandas e condicionais if-elif-else. Não estamos interessados neste momento em mudar o comportamento do programa, mas sim em deixá-lo mais fácil de ler para outras pessoas que tenham experiência com Python.

Nesta página temos 5 erros comuns que atrapalham o entendimento e diminuem a clareza de programas escritos em Python. Vamos a eles.

Padrão 1 - if-true-return-true#

if variable == True:
    return True
else:
    return False
  • se variable tiver o valor True, então a linha 2 irá executar e a função devolve True.
  • se variable tiver o valor False, então a linha 4 irá executar e a função devolve False.

Logo, a função sempre devolve o valor de variable! Podemos então reescrever este trecho como

return variable

O segundo código é mais compacto de se ler, além de também evidenciar que o valor retornado é o resultado da variável do if.

Padrão 2 - if-true-a-recebe-true#

if expr:
    var = True
else:
    var = False
  • se expr tiver o valor True, então a linha 2 irá executar e a variável var recebe True
  • se expr tiver o valor False, então a linha 4 irá executar e a variável var recebe True

Logo, a variável var sempre recebe o valor de expr! Podemos então reescrever este trecho como

var = expr

O segundo código é mais compacto de se ler, além de também evidenciar que o valor de var é o resultado da expressão expr. Esse padrão é muito parecido com o anterior, mas troca o return por uma atribuição.

Padrao 3 - if-true-elif-false#

Outro padrão comum é escrever tanto a condição que deve ser checada quanto o oposto dela. Veja abaixo um exemplo.

if a == 5:
    # bloco 1
elif a != 5:
    # bloco 2

O bloco 2 só roda se a condição a != 5 for verdade, porém isso é equivalente à condição a == 5 ser falsa. Logo, nesse caso podemos simplesmente usar um else, como feito abaixo.

if a == 5:
    # bloco 1
else:
    # bloco 2

Padrão 4 - if-return#

Conectando com o primeiro padrão, podemos simplificar ainda mais situações que usam o padrão abaixo.

if expr:
    # bloco 1
    return value
else:
    # bloco 2

# bloco 3

Como o bloco 1 termina com um return, o else não é necessário. Se o bloco 1 executar a função acaba sem executar bloco 2 e bloco 3. Se bloco 1 não rodar então os outros 2 sempre executam. Assim, podemos mudar o código acima para algo um pouco mais simples.

if expr:
    # bloco 1
    return value

# bloco 2 
# bloco 3  

Padrão 5 - evitar negar condição do if#

Às vezes conseguimos facilmente identificar a condição em que NÃO devemos executar o código. Um padrão que temos observado neste caso é o seguinte.

if expr:
    pass
else:
    # codigo aqui

Apesar de funcionar, o leitor desse código é que tem que descobrir qual é a condição em que o código de fato roda. Por isso, a melhoria apresentada neste exemplo é negar a expressão booleana e não usar else. Veja abaixo.

if not (expr):
    # codigo aqui
....

Colocando em prática#

Abra a lista de exercícios neste link para praticar a identificação e correção desses padrões de erros.