Se Python não tem um operador condicional ternário, é possível simular um usando outras construções de linguagem?
Sim, foi adicionado na versão 2.5. A sintaxe da expressão é:
a if condition else b
Primeiro a 'condição' é avaliada, depois exatamente uma das duas 'a' ou 'b' é avaliada e retornada com base no valor booleano da 'condição'. Se a condição
avalia para True
, então a
é avaliada e retornada, mas b
é ignorada, ou então quando b
é avaliada e retornada, mas a
é ignorada.
Isto permite curto-circuito porque quando a "condição" é verdadeira apenas "a" é avaliada e "b" não é avaliada de todo, mas quando a "condição" é falsa apenas "b" é avaliada e "a" não é avaliada de todo.
Por exemplo:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
Note que os condicionais são uma expressão, não uma declaração. Isso significa que você não pode utilizar declarações de atribuição ou "pass" ou outras expressões dentro de uma expressão condicional **expressão***:
>>> pass if False else x = 3
File "<stdin>", line 1
pass if False else x = 3
^
SyntaxError: invalid syntax
Você pode, no entanto, usar expressões condicionais para atribuir uma variável como essa:
x = a if True else b
Pense na expressão condicional como uma comutação entre dois valores. É muito útil quando se está numa situação de "um valor ou outro", mas não faz muito mais.
Se você precisar usar declarações, você tem que usar uma declaração normal if
em vez de uma expressão condicional expressão***.
Tenha em mente que alguns pitonistas o desaprovam por várias razões:
condição ? a : b
operador ternário de muitas outras linguagens (como C, C++, Go, Perl, Ruby, Java, Javascript, etc.), o que pode levar a bugs quando pessoas não familiarizadas com o comportamento "surpreendente" do Python o utilizam (eles podem reverter a ordem dos argumentos).Se você está tendo problemas para lembrar da ordem, então lembre-se que quando lido em voz alta, você (quase) diz o que você quer dizer. Por exemplo, x = 4 se b > 8 mais 9
é lido em voz alta como x será 4 se b for maior que 8 senão 9
.
Documentação oficial:
Para versões anteriores à 2.5, há o truque:
[expression] and [on_true] or [on_false]
Pode dar resultados errados quando "na_verdade". tem um valor booleano falso.1 Embora tenha o benefício de avaliar as expressões da esquerda para a direita, o que é mais claro na minha opinião.
A partir [da documentação]:
As expressões condicionais (às vezes chamadas de "operador ternário") têm a prioridade mais baixa de todas as operações Python.
A expressão
x se C else y
primeiro avalia a condição, C (não x); se C é verdadeiro, x é avaliado e seu valor é retornado; caso contrário, y é avaliado e seu valor é retornado.Ver [PEP 308] para mais detalhes sobre expressões condicionais.
Novo desde a versão 2.5.
[PEP 308]: https://www.python.org/dev/peps/pep-0308/ "PEP 308 -- Expressões Condicionais".