How to write inline if statement for print?
Question:
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?
Answers:
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.
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)
.
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)
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
.
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.
Try this . It might help you
a=100
b=True
if b:
print a
Well why don’t you simply write:
if b:
print a
else:
print 'b is false'
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
You’re simply overcomplicating.
if b:
print a
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.
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 ''
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 ""}')
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])
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)
print a if b
File "<stdin>", line 1
print a if b
^
SyntaxError: invalid syntax
Answer
Assuming your print
statement should print nothing when the expression is false, the correct syntax is:
print(a if b else '')
(at the time I post this answer print
has evolved to a function and parentheses are now required.)
The reason is if
, the conditional expression, has two mandatory clauses, one when b
is true following if
, one when b
is false following else
. Both clauses are themselves expressions. In your code the else
part is missing. The conditional expression is also called the ternary operator, making it clear it operates on three elements, a condition and two expressions.
Details: Expression vs. statement
Don’t mix the conditional expression with the conditional statement, which can be used without the else
part:
-
The if
statement is a compound statement with further instructions to execute depending on the result of the condition evaluation.
It is not required to have an else
clause where the appropriate additional instructions are provided. Without it, when the condition is false no further instructions are executed after the test.
-
The conditional expression is an expression. Any expression must be convertible to a final value, regardless of the subsequent use of this value by subsequent statements (here the print
statement).
For example you could have used an if
statement this way:
if b: print(a)
Note the difference:
-
There is no instructions executed by the if
statement when the condition is false, nothing is printed.
-
The print
statement print(a if b else '')
is not part of any conditional branching, it is always executed. What it prints is the if
conditional expression. This expression is always evaluated prior to executing the print
statement. So print
outputs an empty line when the condition is false.
Note your other attempt print(a if b==True)
is just equivalent to the first one.
b==True
will be evaluated first and the result substituted. As the logical value of b==True
is equal to b
I guess Python just ignores this evaluation and directly uses b
as in your first attempt.
name = "MyName"
age = 30
#print your name only if you are above 25
print(name if age > 25 else "you are below age")
age = 20
print(name if age > 25 else "you are below age")
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?
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.
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)
.
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)
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
.
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.
Try this . It might help you
a=100
b=True
if b:
print a
Well why don’t you simply write:
if b:
print a
else:
print 'b is false'
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
You’re simply overcomplicating.
if b:
print a
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.
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 ''
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 ""}')
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])
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)
print a if b
File "<stdin>", line 1
print a if b
^
SyntaxError: invalid syntax
Answer
Assuming your print
statement should print nothing when the expression is false, the correct syntax is:
print(a if b else '')
(at the time I post this answer print
has evolved to a function and parentheses are now required.)
The reason is if
, the conditional expression, has two mandatory clauses, one when b
is true following if
, one when b
is false following else
. Both clauses are themselves expressions. In your code the else
part is missing. The conditional expression is also called the ternary operator, making it clear it operates on three elements, a condition and two expressions.
Details: Expression vs. statement
Don’t mix the conditional expression with the conditional statement, which can be used without the else
part:
-
The
if
statement is a compound statement with further instructions to execute depending on the result of the condition evaluation.It is not required to have an
else
clause where the appropriate additional instructions are provided. Without it, when the condition is false no further instructions are executed after the test. -
The conditional expression is an expression. Any expression must be convertible to a final value, regardless of the subsequent use of this value by subsequent statements (here the
print
statement).
For example you could have used an if
statement this way:
if b: print(a)
Note the difference:
-
There is no instructions executed by the
if
statement when the condition is false, nothing is printed. -
The
print
statementprint(a if b else '')
is not part of any conditional branching, it is always executed. What it prints is theif
conditional expression. This expression is always evaluated prior to executing theprint
statement. Soprint
outputs an empty line when the condition is false.
Note your other attempt print(a if b==True)
is just equivalent to the first one.
b==True
will be evaluated first and the result substituted. As the logical value of b==True
is equal to b
I guess Python just ignores this evaluation and directly uses b
as in your first attempt.
name = "MyName"
age = 30
#print your name only if you are above 25
print(name if age > 25 else "you are below age")
age = 20
print(name if age > 25 else "you are below age")