uma - operador python




Python tem um operador condicional ternário? (16)

Python tem um operador condicional ternário?

Sim. Do arquivo de gramática :

test: or_test ['if' or_test 'else' test] | lambdef

A parte de interesse é:

or_test ['if' or_test 'else' test]

Portanto, uma operação condicional ternária é da seguinte forma:

expression1 if expression2 else expression3

expression3 será avaliado com preguiça (isto é, avaliado apenas se expression2 for false em um contexto booleano). E por causa da definição recursiva, você pode encadeá-los indefinidamente (embora possa ser considerado um estilo ruim).

expression1 if expression2 else expression3 if expression4 else expression5 # and so on

Uma nota sobre o uso:

Note que cada if deve ser seguido por else . As pessoas que aprendem a compreensão de listas e expressões geradoras podem achar isso uma lição difícil de aprender - o seguinte não funcionará, já que o Python espera uma terceira expressão para outra coisa:

[expression1 if expression2 for element in iterable]
#                          ^-- need an else here

que gera um SyntaxError: invalid syntax . Portanto, o que está acima é uma parte incompleta da lógica (talvez o usuário espere um não-op na condição falsa) ou o que pode ser pretendido é usar expression2 como um filtro - observa que o seguinte é legal em Python:

[expression1 for element in iterable if expression2]

expression2 funciona como um filtro para a compreensão da lista e não é um operador condicional ternário.

Sintaxe alternativa para um caso mais restrito:

Você pode achar um pouco doloroso escrever o seguinte:

expression1 if expression1 else expression2

expression1 terá que ser avaliado duas vezes com o uso acima. Pode limitar a redundância se for simplesmente uma variável local. No entanto, um idioma Pythonic comum e de alto desempenho para este caso de uso é usar or o comportamento de atalho:

expression1 or expression2

que é equivalente em semântica. Observe que alguns guias de estilo podem limitar esse uso com base em clareza - ele contém muito significado em pouca sintaxe.

Se o Python não tiver um operador condicional ternário, é possível simular um usando outras construções de linguagem?


Operador Ternário em diferentes linguagens de programação

Aqui eu apenas tento mostrar alguma diferença importante no ternary operator entre algumas linguagens de programação.

Operador Ternário em Javascript

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0

Operador Ternário em Ruby

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0

Operador de ternário em Scala

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0

Operador ternário na programação R

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0

Operador ternário em Python

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0

Agora você pode ver a beleza da linguagem python. É altamente legível e sustentável.


Absolutamente, e é incrivelmente fácil de entender.

general syntax : first_expression if bool_expression_is_true else second_expression

Example: x= 3 if 3 > 2 else 4 
# assigns 3 to x if the boolean expression evaluates to true or 4 if it is false

Da documentação :

Expressões condicionais (às vezes chamadas de "operador ternário") têm a menor prioridade de todas as operações do Python.

A expressão x if 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.

Veja PEP 308 para mais detalhes sobre expressões condicionais.

Novo desde a versão 2.5.


O operador condicional ternário simplesmente permite testar uma condição em uma única linha substituindo a multilinha se-else tornando o código compacto.

Sintaxe:

[on_true] if [expressão] mais [on_false]

1- Método simples para usar o operador ternário:

# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min)  # Output: 10

2- Método direto de usar tuplas, dicionário e lambda:

# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lamda is more efficient than above two methods
# because in lambda  we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10

3- operador Ternary pode ser escrito como aninhado if-else:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
        if a > b else "b is greater than a")

A abordagem acima pode ser escrita como:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
    if a > b:
        print("a is greater than b")
    else:
        print("b is greater than a")
else:
    print("Both a and b are equal") 
# Output: b is greater than a

Para o Python 2.5 e mais recente, há uma sintaxe específica:

[on_true] if [cond] else [on_false]

Em Pythons antigos, um operador ternário não é implementado, mas é possível simulá-lo.

cond and on_true or on_false

No entanto, há um problema em potencial, que se cond for avaliado como True e on_true avaliado como False então on_false será retornado em vez de on_true . Se você quiser esse comportamento, o método está OK, caso contrário, use isto:

{True: on_true, False: on_false}[cond is True] # is True, not == True

que pode ser envolvido por:

def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]

e usado desta maneira:

q(cond, on_true, on_false)

É compatível com todas as versões do Python.


Sim, foi added na versão 2.5.
A sintaxe é:

a if condition else b

A primeira condition é avaliada e, em seguida, a ou b é retornada com base no valor Boolean da condition
Se a condition for avaliada como True a é retornada, else b será retornado.

Por exemplo:

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

Note que condicionais são uma expressão , não uma declaração . Isso significa que você não pode usar atribuições ou pass ou outras declarações em um condicional:

>>> pass if False else x = 3
  File "<stdin>", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax

Nesse caso, você tem que usar uma instrução if normal em vez de uma condicional.

Tenha em mente que isso é desaprovado por alguns Pythonistas por vários motivos:

  • A ordem dos argumentos é diferente de muitas outras linguagens (como C, Ruby, Java, etc.), o que pode levar a bugs quando pessoas não familiarizadas com o comportamento "surpreendente" do Python o usam (elas podem reverter a ordem).
  • Alguns acham "difícil de manejar", uma vez que contraria o fluxo normal do pensamento (pensando primeiro na condição e depois nos efeitos).
  • Razões estilísticas.

Se você está tendo problemas para lembrar o pedido, lembre-se de que, se você ler em voz alta, você (quase) diz o que quer dizer. Por exemplo, x = 4 if b > 8 else 9 for lido em voz alta como x will be 4 if b is greater than 8 otherwise 9 .

Documentação oficial:


Sim, python tem um operador ternário, aqui está a sintaxe e um código de exemplo para demonstrar o mesmo :)

#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false


a= input("Enter the First Number ")
b= input("Enter the Second Number ")

print("A is Bigger") if a>b else print("B is Bigger")

Sim.

>>> b = (True if 5 > 4 else False)
>>> print b
True

Sim:

Digamos que você queira dar um valor x variável se algum bool for verdadeiro e da mesma forma

X = 5 se algo mais x = 10

X = [algum valor] se [se isso for verdadeiro primeiro valor avalia] else [outro valor avalia]


Sintaxe: O operador Ternary será dado como:

[on_true] if [expression] else [on_false]

por exemplo

x, y = 25, 50
big = x if x < y else y
print(big)

Um operador para uma expressão condicional no Python foi adicionado em 2006 como parte da Python Enhancement Proposal 308 . Sua forma difere do comum ?: Operador e é:

<expression1> if <condition> else <expression2>

o que equivale a:

if <condition>: <expression1> else: <expression2>

Aqui está um exemplo:

result = x if a > b else y

Outra sintaxe que pode ser usada (compatível com versões anteriores a 2.5):

result = (lambda:y, lambda:x)[a > b]()

onde operandos são avaliados preguiçosamente .

Outra maneira é indexar uma tupla (que não é consistente com o operador condicional da maioria das outras linguagens):

result = (y, x)[a > b]

ou dicionário explicitamente construído:

result = {True: x, False: y}[a > b]

Outro (menos confiável), mas método mais simples é usar and / or operadores:

result = (a > b) and x or y

no entanto, isso não funcionará se x for False .

Uma possível solução alternativa é criar listas x e y ou tuplas da seguinte maneira:

result = ((a > b) and [x] or [y])[0]

ou:

result = ((a > b) and (x,) or (y,))[0]

Se você está trabalhando com dicionários, ao invés de usar uma condicional ternária, você pode tirar proveito de get(key, default) , por exemplo:

shell = os.environ.get('SHELL', "/bin/sh")

Fonte: ?:


Você pode indexar em uma tupla:

(falseValue, trueValue)[test]

test precisa retornar True ou False .
Pode ser mais seguro implementá-lo sempre como:

(falseValue, trueValue)[test == True]

ou você pode usar o bool() embutido para assegurar um valor Boolean :

(falseValue, trueValue)[bool(<expression>)]

se variável é definida e você quer verificar se tem valor você pode apenas a or b

def test(myvar=None):
    # shorter than: print myvar if myvar else "no Input"
    print myvar or "no Input"

test()
test([])
test(False)
test('hello')
test(['Hello'])
test(True)

vai sair

no Input
no Input
no Input
hello
['Hello']
True

expression1 if condition else expression2

>>> a = 1
>>> b = 2
>>> 1 if a > b else -1 
-1
>>> 1 if a > b else -1 if a < b else 0
-1

In [1]: a = 1 if False else 0

In [2]: a
Out[2]: 0

In [3]: b = 1 if True else 0

In [4]: b
Out[4]: 1




python-2.5