This question already has answers here: Does Python have a ternary conditional operator? (32 answers) Closed 2 years ago. The community reviewed whether to reopen this question 8 months ago and left it closed: Original close reason(s) were not resolved
I'm just getting into Python and I really like the terseness of the syntax. However, is there an easier way of writing an if
-then
-else
statement so it fits on one line?
For example:
if count == N:
count = 0
else:
count = N + 1
Is there a simpler way of writing this? I mean, in Objective-C I would write this as:
count = count == N ? 0 : count + 1;
Is there something similar for Python?
Update
I know that in this instance I can use count == (count + 1) % N
.
I'm asking about the general syntax.
count = count == N ? 0 : N + 1;
instead of count = count == N ? 0 : count + 1;
?
if 1==1: print('hi')
can be just used like that. And '''if 1==1: print('hi')'''
will print nothing!
count == (count + 1) % N
used to do. Currently it just evaluates count == (count + 1)
(which is, naturally, results in False
all the time). I've checked in Python 3.6.1 and Python 2.7.10.
That's more specifically a ternary operator expression than an if-then, here's the python syntax
value_when_true if condition else value_when_false
Better Example: (thanks Mr. Burns)
'Yes' if fruit == 'Apple' else 'No'
Now with assignment and contrast with if syntax
fruit = 'Apple'
isApple = True if fruit == 'Apple' else False
vs
fruit = 'Apple'
isApple = False
if fruit == 'Apple' : isApple = True
Moreover, you can still use the "ordinary" if
syntax and conflate it into one line with a colon.
if i > 3: print("We are done.")
or
field_plural = None
if field_plural is not None: print("insert into testtable(plural) '{0}'".format(field_plural))
Yes: if x == 4: print x, y; x, y = y, x
I guess, you know, hobgoblins and whatnot.
count = 0 if count == N else N+1
- the ternary operator. Although I'd say your solution is more readable than this.
General ternary syntax:
value_true if <test> else value_false
Another way can be:
[value_false, value_true][<test>]
e.g:
count = [0,N+1][count==N]
This evaluates both branches before choosing one. To only evaluate the chosen branch:
[lambda: value_false, lambda: value_true][<test>]()
e.g.:
count = [lambda:0, lambda:N+1][count==N]()
(False, True) == (0, 1)
which I don't know is guaranteed (but didn't check). And though terse, it isn't going to win any readability awards. You can also do "abcdefg"[i]
in C, but it doesn't mean you should.
False == 0
and True == 1
: no implementation detail here. :) See the 'Booleans' heading under docs.python.org/reference/…
{N: 0}.get(count, N+1)
. A third way, if N+1
is some expensive function: {N: 0}.get(count, "anything truthy") and f(N)
. This requires you to know the truthiness of the values of the dict, and they need to all have the same truthiness. If the values are all truthy, invert the boolean operator, e.g. {0: 7}.get(weekday, False) or f(weekday)
<execute-test-successful-condition> if <test> else <execute-test-fail-condition>
with your code-snippet it would become,
count = 0 if count == N else N + 1
Success story sharing
print('matched!' if re.match(r'\d{4,}', '0aa9') else "nopes")
(assuming you import re)Yes' if fruit == 'Apple' else print('No Apple')
), but not with keywords ('Yes' if fruit == 'Apple' else raise Exception('No Apple')
)