为什么Python没有“continue if”语句?

8

我认为这是一段非常易读的代码,

for i in range(100):
    continue if i % 2 == 0

但它在语法上是不正确的。在Python中,我们可以做其他很好的事情,比如:
for i in things:
    total += 3 if i % 2 == 0 else 1

或者,也许,
return a if b > a else c

为什么我们不能使用 continue if 语句?

4
如果你想这样做,请使用if i % 2 == 0: continue。这只是另一种方式,反过来写并加上一个冒号。我不明白为什么人们总是反对这种方式。就像他们讨厌冒号一样。 - user2357112
5
如果您想这样做,请使用for i in range(1, 100, 2) =) - Ry-
1
在我看来,“continue”并不是特别好的选择。我想不起来有哪段代码比生成器推导、all()any()更好用,尤其是当我们需要在函数中使用多个break/continue时。 - millimoose
3个回答

12

流程:

for i in range(100):
    continue if i % 2 == 0

等同于:

for i in range(1, 100, 2):
    ...

更通用地讲,要:

for i in range(100):
    if i % 2 == 0:
        continue

Python语言的设计者们历来反对只是提供稍微不同的方式来完成相同任务的语法更改(“应该有一种显而易见的方法来做到这一点”)。

你提到的一行构造类型

x if cond else y

这里是一个例外。它被添加到语言中,以提供一种更少出错的方式来实现许多用户已经尝试使用 andor 短路技巧做的事情(来源:Guido)。在代码中会使用:

cond and x or y

这两种写法在逻辑上并不等价,但对于已经熟悉 C 语言的用户来说,很容易犯这种错误写法:cond ? : x : y。 正确的等价写法是:

(cond and [x] or [y])[0]

但这样很丑陋。因此,添加表达式x if cond else y的理由并不只是为了方便而已。


谢谢。我有一种感觉,这里背后有一些 Python 的传说 :) - chadlagore

3

x if cond else y 实际上是一个表达式。 表达式是一种可以求值的语句,在这种情况下,它的值可以是 x 或者 y

continue 不是一个值,所以它与前面提到的内容有所不同。

if cond:
    continue

使用continue if cond语句比较容易理解和避免出错,而v = x if cond else y语句可能更好一些。

if cond:
    v = x
else:
    v = y

还有一个事实,如果我们允许使用continue if cond,我们就添加了一种新的使用模式_ if cond的方式,即我们允许在没有else 的情况下使用它。

更多信息请参见: https://docs.python.org/2.5/whatsnew/pep-308.html


谢谢,我同意在这种情况下该怎么处理else存在歧义。 - chadlagore

-1

Python确实有这样的东西,语法只是有点不同。与将“if”和“continue”组合为一个语句不同,它们被分成了条件语句(if、while等)和控制流程(continue、pass、break等),如果它评估为true。在您的第一个代码示例中,语法将如下:

for i in range(100):
    if i % 2 == 0:
        continue
    else:
        #you could also add an else like this do something else if the 
        #number evaluated to odd

这将继续执行外部循环的下一次迭代。还有其他有用的迭代工具,称为“控制流工具”。我会包含一个链接到解释这个的Python文档。那里有大量有用的东西,请务必查看。

这里还有人建议使用单行语法,这也可以。然而,了解两种方法是好的;这样你就可以尽可能地保持代码简单,但如果你的算法受益于嵌套循环和条件,你也将拥有这种能力。

愉快的编码!

https://docs.python.org/3/tutorial/controlflow.html


2
你的解释基本上说明了continue关键字的存在 - 这一点是显而易见的!问题在于为什么我们在使用它时没有像其他关键字那样得到相同的语法糖。 - chadlagore
我不认为那是问题所在。我认为他想知道continue和if是否一体化。但是,如果没有提问者的澄清,你和我只能争论语义。然而,如果问题确实如你所认为的那样,我的答案将是所有语言都可以完成相同的任务;因此,差异在于完成任务需要采取哪些步骤。从这一点上说,这成为了一个语法偏好的问题。因此,如果问题像你所说的那样,应该被downvote为主观问题。 - Hildy

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