Como escrever em linha se declaração para impressão?

378

Eu preciso imprimir algumas coisas apenas quando uma variável booleana estiver definida como True. Então, depois de analisar isso , tentei com um exemplo simples:

>>> a = 100
>>> b = True
>>> print a if b
  File "<stdin>", line 1
    print a if b
             ^
SyntaxError: invalid syntax  

A mesma coisa se eu escrever print a if b==True.

O que estou perdendo aqui?

Ricky Robinson
fonte
11
possível duplicata do Python tem um operador condicional ternário?
Kenorb
2
Boa pergunta, respostas complexas ... uma pergunta direta seria "a outra parte é obrigatória".
mins

Respostas:

739

Python não tem uma if declaração à direita .

Existem dois tipos de ifem Python:

  1. if declaração:

    if condition: statement
    if condition:
        block
  2. if expressão (introduzida no Python 2.5)

    expression_if_true if condition else expression_if_false

E note que ambas print ae b = asão declarações. Somente a aparte é uma expressão. Então se você escreve

print a if b else 0

Isso significa

print (a if b else 0)

e da mesma forma quando você escreve

x = a if b else 0

Isso significa

x = (a if b else 0)

Agora, o que seria impresso / atribuído se não houvesse else cláusula? A impressão / atribuição ainda está .

E observe que, se você não deseja que ela esteja lá, sempre pode escrever a ifdeclaração regular em uma única linha, embora seja menos legível e não haja realmente nenhuma razão para evitar a variante de duas linhas.

Jan Hudec
fonte
Eu acho que if condition: statementisso não funciona no caso de declarações multilinhas.
Val
Sim, mas você não precisa usar se, basta usar lógica booleana, como mostro abaixo nos meus exemplos.
1933 Eduardo Eduardo
11
@JanHudec Se o Python não tem um trailing if, por que isso funciona print [i for i in range(10) if i%2]:? Gostaria que eles permitem fora de compreensões ...
mbomb007
3
@ mbomb007, que também não é uma declaração trailing if . É simplesmente parte da compreensão da lista (ou gerador). Observe que a coisa antes do if não é uma declaração, são duas expressões forentre elas.
Jan Hudec
2
@AlexandervonWernherr, sim, isso parece razoável.
Jan Hudec
93

EXPRESSION if-else embutido deve sempre conter a cláusula else, por exemplo:

a = 1 if b else 0

Se você deseja manter o valor da variável 'a' inalterado - assumindo o valor 'a' antigo (mais ainda é exigido pelas demandas de sintaxe):

a = 1 if b else a

Este pedaço de código deixa um inalterado quando b voltas para ser falsa.

Rostyslav Dzinko
fonte
11
Oh. Mas e se eu não quiser que nada aconteça no ramo else? Eu preciso de algo como:print a if b
Ricky Robinson
2
else aseria melhor entãoelse 0
aneróide
13
if b: print aSó precisa de um simples se nesse caso
jamylak
4
Corrigindo a resposta, porque é quase bom se não fosse a palavra 'declaração' que a tornava totalmente ruim. A essência da questão é que é não uma declaração.
Jan Hudec
11
+ 1-1: Bom para apontar que a expressão else é obrigatória, mas não está correta por não fornecer a resposta para o caso em questão: imprima "nada" (algo como as linhas de ""ou None, veja detalhes em outras respostas).
precisa saber é o seguinte
18

A declaração 'else' é obrigatória. Você pode fazer coisas assim:

>>> b = True
>>> a = 1 if b else None
>>> a
1
>>> b = False
>>> a = 1 if b else None
>>> a
>>> 

EDITAR:

Ou, dependendo de suas necessidades, você pode tentar:

>>> if b: print(a)
Alexis Huet
fonte
15

Se você não quiser, from __future__ import print_functionfaça o seguinte:

a = 100
b = True
print a if b else "",  # Note the comma!
print "see no new line"

Que imprime:

100 see no new line

Se você não é averso from __future__ import print_functionou está usando o python 3 ou posterior:

from __future__ import print_function
a = False
b = 100
print(b if a else "", end = "")

Adicionar o else é a única alteração que você precisa fazer para tornar seu código sintaticamente correto. Você precisa do else para a expressão condicional (o "in line if else blocks")

A razão de eu não usar Noneou 0como outros no segmento têm usado, é porque usar None/0faria com que o programa para print Noneou print 0nos casos em que bé False.

Se você quiser ler sobre este tópico, incluí um link para as notas de versão do patch que esse recurso foi adicionado ao Python.

O 'padrão' acima é muito semelhante ao padrão mostrado no PEP 308:

Essa sintaxe pode parecer estranha e inversa; por que a condição vai no meio da expressão, e não na frente, como nos c de C? x: y? A decisão foi verificada aplicando a nova sintaxe aos módulos da biblioteca padrão e vendo como o código resultante era lido. Em muitos casos em que uma expressão condicional é usada, um valor parece ser o 'caso comum' e um valor é um 'caso excepcional', usado apenas em ocasiões mais raras quando a condição não é atendida. A sintaxe condicional torna esse padrão um pouco mais óbvio:

conteúdo = ((doc + '\ n') se outro documento '')

Então, no geral, essa é uma maneira razoável de abordá-la, mas você não pode argumentar com a simplicidade de:

if logging: print data
Noelkd
fonte
Obrigado. A coisa aqui é que print ""ainda imprimirá algo: uma linha em branco.
Ricky Robinson
Obrigado. O endargumnt printaparece apenas no Python 3.x, certo?
Ricky Robinson
11
sim, eu sou mais do que um homem de 2,7, portanto, o from __future__ import print_function
Noelkd 2/13
11

Desde o 2.5, você pode usar o operador condicional ternário equivalente a C? ”:” E a sintaxe é:

[on_true] if [expression] else [on_false]

Portanto, seu exemplo é bom, mas você deve simplesmente adicionar else, como:

print a if b else ''
kenorb
fonte
2
Observe que print ''ainda imprimirá uma nova linha, o que é evitado na resposta de Noelkd.
yoniLavi
8

Você pode usar:

print (1==2 and "only if condition true" or "in case condition is false")

Da mesma forma, você pode continuar assim:

print 1==2 and "aa" or ((2==3) and "bb" or "cc")

Exemplo do mundo real:

>>> print "%d item%s found." % (count, (count>1 and 's' or ''))
1 item found.
>>> count = 2
>>> print "%d item%s found." % (count, (count>1 and 's' or ''))
2 items found.
Eduardo
fonte
7

Isso pode ser feito com formatação de string . Ele funciona com a notação%, bem como com .format () e f-strings (novo em 3.6)

print '%s' % (a if b else "")

ou

print '{}'.format(a if b else "")

ou

print(f'{a if b else ""}')
Eric Ed Lohmar
fonte
Isso não tem nada a ver com formatação; você poderia apenas fazer print a if b else "". Qual é exatamente o que a resposta de Noelkd faz.
melpomene
@melpomene, mas imprimir "" anuncia uma nova linha, que pode ser evitada usando print "",(dois pontos) para Python2 e usando print("", end="")para Python3.
M3nda
5

Para o seu caso, isso funciona:

a = b or 0

Editar: Como isso funciona?

Na pergunta

b = True

Então, avaliando

b or 0

resulta em

True

que é atribuído a a .

Se b == False?, b or 0avaliaria o segundo operando ao 0qual seria atribuído a.


fonte
3
A feiúra e a probabilidade de erro dessa expressão são a razão pela qual temos expressão condicional em primeiro lugar.
Jan Hudec
5

Tente isso. Isso pode ajudá-lo

a=100
b=True

if b:
   print a
SkariaArun
fonte
4

Você é simplesmente complicado demais.

if b:
   print a
Nande
fonte
11
Claro que é a opção mais fácil. Eu acho que no momento (agosto 2012) que eu queria fazer algo como:if DEBUG: print something
Ricky Robinson
Resposta duplicada? Veja isso por SkariaArun, e também um comentário.
precisa saber é o seguinte
2

Você sempre precisa de um elseem linha se:

a = 1 if b else 0

Mas uma maneira mais fácil de fazer isso seria a = int(b).

Daniel Roseman
fonte
3
-1: Mais fácil. E totalmente ilegível. E não o que o solicitante queria de qualquer maneira.
Jan Hudec
ITYM a = int(bool(b)).
glglgl
1

Bem, por que você simplesmente não escreve:

if b:
    print a
else:
    print 'b is false'
IcyFlame
fonte
1

hmmm, você pode fazer isso com uma compreensão de lista . Isso só faria sentido se você tivesse um alcance real ... mas faz o trabalho:

print([a for i in range(0,1) if b])

ou usando apenas essas duas variáveis:

print([a for a in range(a,a+1) if b])
George Mogilevsky
fonte