ChatGPT解决这个技术问题 Extra ChatGPT

How to write inline if statement for print?

I need to print some stuff only when a boolean variable is set to True. So, after looking at this, I tried with a simple example:

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

Same thing if I write print a if b==True.

What am I missing here?

Good question, complex answers... a straight one would be "the else part is mandatory".
A good thing to note is that the if expression works in lambda, but not the one-line statement.

J
Jan Hudec

Python does not have a trailing if statement.

There are two kinds of if in Python:

if statement: if condition: statement if condition: block if expression (introduced in Python 2.5) expression_if_true if condition else expression_if_false

And note, that both print a and b = a are statements. Only the a part is an expression. So if you write

print a if b else 0

it means

print (a if b else 0)

and similarly when you write

x = a if b else 0

it means

x = (a if b else 0)

Now what would it print/assign if there was no else clause? The print/assignment is still there.

And note, that if you don't want it to be there, you can always write the regular if statement on a single line, though it's less readable and there is really no reason to avoid the two-line variant.


I think that if condition: statement does not work in case of multiline statements.
Yes, but you don't need to use if, simply use boolean logic like I show below in my examples.
@JanHudec If Python doesn't have a trailing if, then why does this work: print [i for i in range(10) if i%2]? I wish they'd allow it outside of comprehensions...
@mbomb007, that is not a trailing if statement either. It is simply part of the list (or generator) comprehension. Note that the thing before the if is not a statement, it is two expressions with for between them.
@AlexandervonWernherr, yes, that sounds reasonable.
J
Jan Hudec

Inline if-else EXPRESSION must always contain else clause, e.g:

a = 1 if b else 0

If you want to leave your 'a' variable value unchanged - assing old 'a' value (else is still required by syntax demands):

a = 1 if b else a

This piece of code leaves a unchanged when b turns to be False.


Oh. But what if I don't want anything to happen in the else branch? I need something like: print a if b
else a would be better then else 0
if b: print a Just need a simple if in that case
Fixing the answer, because it's almost good if it wasn't for the word 'statement' which made it totally bad. The gist of the question is that it's not a statement.
+1-1: Good for pointing out that the else expression is mandatory, but not ok for not providing the answer for the case in question: print "nothing" (something along the lines of "" or None, see details in other answers).
A
Alexis Huet

The 'else' statement is mandatory. You can do stuff like this :

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

EDIT:

Or, depending of your needs, you may try:

>>> if b: print(a)

N
Noelkd

If you don't want to from __future__ import print_function you can do the following:

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

Which prints:

100 see no new line

If you're not aversed to from __future__ import print_function or are using python 3 or later:

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

Adding the else is the only change you need to make to make your code syntactically correct, you need the else for the conditional expression (the "in line if else blocks")

The reason I didn't use None or 0 like others in the thread have used, is because using None/0 would cause the program to print None or print 0 in the cases where b is False.

If you want to read about this topic I've included a link to the release notes for the patch that this feature was added to Python.

The 'pattern' above is very similar to the pattern shown in PEP 308:

This syntax may seem strange and backwards; why does the condition go in the middle of the expression, and not in the front as in C's c ? x : y? The decision was checked by applying the new syntax to the modules in the standard library and seeing how the resulting code read. In many cases where a conditional expression is used, one value seems to be the 'common case' and one value is an 'exceptional case', used only on rarer occasions when the condition isn't met. The conditional syntax makes this pattern a bit more obvious: contents = ((doc + '\n') if doc else '')

So I think overall this is a reasonable way of approching it but you can't argue with the simplicity of:

if logging: print data

Thanks. The thing here is that print "" will still print something: a blank line.
Thanks. The end argumnt in print only appears in Python 3.x, right?
aye, I'm more of a 2.7 man hence the from __future__ import print_function
C
Community

This can be done with string formatting. It works with the % notation as well as .format() and f-strings (new to 3.6)

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

or

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

or

print(f'{a if b else ""}')

This has nothing to do with formatting; you could just do print a if b else "". Which is exactly what Noelkd's answer does.
@melpomene but printing "" ads a new line, that can be avoided using print "", (colon) for Python2, and using print("", end="") for Python3.
C
Community

Since 2.5 you can use equivalent of C’s ”?:” ternary conditional operator and the syntax is:

[on_true] if [expression] else [on_false]

So your example is fine, but you've to simply add else, like:

print a if b else ''

Note that the print '' will still print a newline, which is avoided in the answer by Noelkd.
Y
Yaakov Bressler

You can write an inline ternary operator like so:

sure = True

# inline operator
is_true = 'yes' if sure else 'no'

# print the outcome
print(is_true)

E
Eduardo

You can use:

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

Just as well you can keep going like:

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

Real world example:

>>> 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.

佚名

For your case this works:

a = b or 0

Edit: How does this work?

In the question

b = True

So evaluating

b or 0

results in

True

which is assigned to a.

If b == False?, b or 0 would evaluate to the second operand 0 which would be assigned to a.


Ugliness and errorproneness of this expression is the reason why we have conditional expression in the first place.
D
Duncan

Try this . It might help you

a=100
b=True

if b:
   print a

M
Michael Petrotta

You're simply overcomplicating.

if b:
   print a

Of course that's the easiest option. I think that at the time (august 2012) I wanted to do something like: if DEBUG: print something
Duplicated answer? See that by SkariaArun, and also a comment.
D
Daniel Roseman

You always need an else in an inline if:

a = 1 if b else 0

But an easier way to do it would be a = int(b).


-1: Easier. And totally unreadable. And not what the asker wanted anyway.
ITYM a = int(bool(b)).
G
George Mogilevsky

hmmm, you can do it with a list comprehension. This would only make sense if you had a real range.. but it does do the job:

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

or using just those two variables:

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

I
IcyFlame

Well why don't you simply write:

if b:
    print a
else:
    print 'b is false'