"While"循环单行代码

13

是否有可能在一行上纯粹使用Python while循环?我尝试过以下代码:

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

但是它会产生一个错误信息:无效语法,位于if语句处。

1
为什么不试一下呢?那是一个无限循环,但就Python而言,它可以工作。 - Martijn Pieters
@MartijnPieters 我试过了,但不起作用。 - user2128561
3
“它不起作用”并不是一个问题的描述。到底是什么没有起作用?你原本期望发生什么事情,实际上发生了什么?你收到了什么错误信息? - Martijn Pieters
在一行上不能有嵌套的控制结构。 - Volatility
1
没错,那个不行。复杂语句需要换行。 - Martijn Pieters
请不要在未阅读http://www.python.org/dev/peps/pep-0008/之前这样做,请务必阅读,Python非常重视代码的清晰度。`可读性很重要。` - Samy Vilar
3个回答

25

当在Python中使用复合语句(需要套件,缩进块的语句),并且该块仅包含简单语句时,您可以删除换行符,并使用分号;将简单语句分隔开。

但是,这不支持复合语句。

因此:

if expression: print "something"

使用单个简单语句也可以实现,但是组合语句更为常见。

while expression: print("something"); print("something else")

但是:
while expression: if expression: print "something"

不是因为while和if语句都是复合语句,所以不能这样做。
对于您的特定示例,您可以使用条件表达式替换if表达式:赋值部分,因此通过使用表达式而不是复杂语句:
while expression: target = true_expression if test_expression else false_expression

一般来说,或者更具体地说,在编写程序时,如果 n 小于 1000,将执行 rn += n,除非 n 不同时是 3 和 5 的倍数,否则执行 rn += 0。

从风格的角度来看,通常希望将这一行单独处理。


有点相关的是,Python 中是否有与 C 语言中 ?: 语句等效的语句?如果有的话,它应该能够胜任。 - asheeshr
2
@AshRj,有的,请看我的回答。 - l4mpi
@AshRj:是的,条件表达式为 true_expression if expression else false_expression - Martijn Pieters
我知道已经晚了十年,但那些是冒号,不是分号。 - Dawood ibn Kareem
@DawoodibnKareem:不,我说的是分号;,而不是冒号:,用于分隔简单语句。例如,在Python中,您可以执行print('foo'); print('bar'),因为调用表达式语句是一个简单语句。我还谈到了复合语句,这些使用冒号: - Martijn Pieters
显示剩余3条评论

5
在你的例子中,你试图将两个层级的块/缩进折叠成一行,这是不允许的。你只能在简单语句中做到这一点,而不能在循环、if语句、函数定义等中。话虽如此,在你的例子中,有一个使用三元运算符的解决方法:
while n < 1000: rn += n if (n % 3 == 0 or n % 5 == 0) else 0

这段代码的意思是:如果条件成立,将数字 n 加到 rn 中,否则加 0。


1
可以做类似的事情:
rn = 100
for n in range(10): rn += n if (n%3==0 or n%5==0) else 0

需要作出解释。要点是什么?请通过编辑(更改)您的答案来回应,不要在评论中回应(但请勿添加“编辑:”,“更新:”或类似内容——答案应该看起来像今天写的一样)。 - Peter Mortensen
需要解释一下。要点是什么?请通过编辑(更改)您的答案来回复,而不是在评论中回复(但是请不要添加"编辑:"、"更新:"或类似的内容——答案应该看起来像是今天写的)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接