7
votes

Is it possible for to have a python while loop purely on one line, I've tried this:

while n<1000:if n%3==0 or n%5==0:rn+=n

But it produces an error message: Invalid Syntax at the if statement

3
Why don't you try it? That is a infinite loop, but it'll work as far as Python is concerned. - Martijn Pieters♦
@MartijnPieters I have, it doesn't work - user2128561
"it doesn't work" is not a problem description. What doesn't work? What did you expect to happen, what happened instead? What error did you get? - Martijn Pieters♦
You can't have nested control structures on one line. - Volatility
Right, that doesn't work. Complex statements need new lines. - Martijn Pieters♦

3 Answers

15
votes

When using a compound statement in python (statements that need a suite, an indented block), and that block contains only simple statements, you can remove the newline, and separate the simple statements with semicolons.

However, that does not support compound statements.

So:

if expression: print "something"

works, but

while expression: if expression: print "something"

does not because both the while and if statements are compound.

For your specific example, you can replace the if expression: assignment part with a conditional expression, so by using an expression instead of a complex statement:

while expression: target = true_expression if test_expression else false_expression

in general, or while n<1000: rn += n if not (n % 3 and n % 5) else 0 specifically.

From a style perspective, you generally want to leave that one line on it's own, though.

5
votes

In your example, you try to collapse two levels of blocks / indentation into a single line, which is not allowed. You can only do this with simple statements, not loops, if statements, function definitions etc. That said, for your example there is a workaround using the ternary operator:

while n < 1000: rn += n if (n % 3 == 0 or n % 5 == 0) else 0

which reads as 'add n to rn if the condition holds, else add 0'.

1
votes

It is posible to do something similar:

rn = 100
for n in range(10): rn += n if (n%3==0 or n%5==0) else 0