ChatGPT解决这个技术问题 Extra ChatGPT

Putting a simple if-then-else statement on one line [duplicate]

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.

Shouldn't that be count = count == N ? 0 : N + 1; instead of count = count == N ? 0 : count + 1;?
For this specific case: count = (count+1) % (N+1) would work.
You can do an if-then on one line. '''if 1==1: print('hi')'''
if 1==1: print('hi') can be just used like that. And '''if 1==1: print('hi')''' will print nothing!
I wonder what 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.

p
princelySid

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

It's very much like comprehensions. You can do this: print('matched!' if re.match(r'\d{4,}', '0aa9') else "nopes") (assuming you import re)
Note that the shorthand syntax is only valid for actual values. You can use it with constants and functions (Yes' if fruit == 'Apple' else print('No Apple')), but not with keywords ('Yes' if fruit == 'Apple' else raise Exception('No Apple'))
It is not clear to me if I can omit else, can I just have 'Yes' if fruit == 'Apple'?
You can't omit the else when using the ternary form, it results in a syntax error, but you could do a normal if in one line , I updated the samples to illustrate.
This answer could be benefited by contrasting this method with the same thing using a multi-line if statement.
k
kale

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

Can someone explain why this isn't the best answer? Its definitely the easiest to read IMHO.
the question included an "else" condition
@johannes-braunias Your method goes against PEP8 standards.
That's weird. Here's a specific "Yes" example from PEP8. Yes: if x == 4: print x, y; x, y = y, x I guess, you know, hobgoblins and whatnot.
PEP8 isn't holy writ. If your program would be better with this syntax, it's fine.
T
Tim Pietzcker
count = 0 if count == N else N+1

- the ternary operator. Although I'd say your solution is more readable than this.


i like your answer better, it's simple and short
j
jameshfisher

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]()

This counts on an implementation detail that (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.
@msw: It's guaranteed that False == 0 and True == 1: no implementation detail here. :) See the 'Booleans' heading under docs.python.org/reference/…
But aren't both values computed, no matter what [] is?
@msw: well, when it comes to ternary operations, I always prefer the first one. I just showed another possible way...
Another way: {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)
p
phoenix24
<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