sábado, 8 de dezembro de 2012

Atribuição Condicional de Variáveis no Python

A atribuição condicional de variáveis é um recurso muito útil e muitas linguagens de programação possuem meios de facilitar o seu emprego. Este recurso consiste basicamente em atribuir valores a variáveis de acordo com uma condição expressa. Observe o esquema:
variável = condição valor_se_verdadeiro ou valor_se_falso
Ou seja, a variável receberá um valor se a condição for verdadeira ou outro valor se a condição for falsa. 
Linguagens como Java e Javascript utilizam uma sintaxe semelhante ao esquema acima:

// O valor de num1 será 1
int num1 = true ? 1 : 0;

// O valor de num2 será 0
int num2 = false ? 1 : 0;

String msg = (num1 < num2) ? "num2 é maior" : "num1 é maior";

Dessa forma, a construção do software se torna mais dinâmica. Observe que o mesmo resultado do exemplo acima poderia ser obtido da forma tradicional:

int num1 = 1;
int num2 = 0;
String msg;
if (num1 < num2){
    msg = "num2 é maior";
}else{
    msg = "num1 é maior";
}
Mas fica evidente que o primeiro exemplo é bem mais prático.
Muitas outras linguagens como PHP, C/C++, C#, Perl, Ruby utilizam o operador ?: (chamado de operador ternário) para realizar a atribuição condicional.
No Python não há uma sintaxe específica para a atribuição condicional, como no Java. Mas uma variação da condição if-else produz o mesmo resultado. Veja:

# num1 = 1
num1 = 1 if True else 0
# num2 = 0
num2 = 1 if False else 0

msg = "num2 é maior" if (num1 < num2) else "num1 é maior"

# Outro exemplo

ddd = 48
cod_RS = [51, 53, 54, 55]
cod_SC = [47, 48, 49]
cod_PR = [41, 42, 43, 44, 45, 46]
UF = "RS" if(ddd in cod_RS) else "SC" if(ddd in cod_SC) else "PR" if(ddd in cod_PR) else ""
Neste caso, o uso do else é obrigatório, uma vez que a variável declarada precisa receber um valor de qualquer forma.
Existem maneiras de simular uma atribuição condicional no Python, veja alguns exemplos:
a = 10
b = 5
resultado = ["b é maior que a","a é maior que b"][a>b]
resultado = {True : "a é maior que b", False : "b é maior que a"}[a>b]
Na linha 3, temos uma lista com duas strings. Após a lista, temos um índice para acessar um dos itens desta lista. Mas esse índice retornará True, então que item da lista um índice True retorna? Para descobrir experimente digitar int(True) e int(False) no terminal do Python.
O exemplo da linha 4 é mais óbvio. Criamos um dicionário com uma chave True e outra False e os valores associados. Logo após o dicionário, um índice retornará o valor correspondente à chave dele.
Embora estes exemplos possam até parecer práticos, na realidade eles violam as boas práticas do Python. Isso porque os exemplos acima não são tão óbvios e legíveis, e também porque não faz sentido criar um novo objeto, seja lista ou dicionário, apenas para fazer uma atribuição em outra variável.
Outra forma de atribuir variáveis condicionais no Python é através do OR:

def calcula_imposto():
    if aliquota > 0.0:
        return 12.5
    else:
        return None

aliquota = 0.0

ICMS = calcula_imposto() or "ISENTO"


Note que o exemplo acima não é tão prático quanto parece. Procure evitar usar atribuição condicional com tipos diferentes (neste caso, strings e doubles). O operador OR vai testar se o primeiro valor atribuído é válido, se não for, a variável receberá o segundo valor.
A atribuição condicional com o operador OR deve ser utilizada com cuidado e atenção, pois é preciso entender o que é um valor válido. Veja mais exemplos abaixo:

a = None
b = a or 1

a = False
b = a or True

a = 0
b = a or 1

a = ""
b = a or "b"

a = []
b = a or ["b"]

Observe que em TODOS os exemplos acima, a variável b receberá sempre o segundo valor, porque todos os valores definidos para a são considerados inválidos pelor operador OR.
Na dúvida, prefira utilizar o if-else para atribuições condicionais.

Nenhum comentário:

Postar um comentário