在Python中使用“ continue”语句的示例?


177

定义中的continue语句是:

continue语句从循环的下一个迭代继续。

我找不到任何好的代码示例。

有人可以在continue必要时提出一些简单的案例吗?

Answers:


217

这是一个简单的例子:

for letter in 'Django':    
    if letter == 'D':
        continue
    printf("Current Letter: {letter}")

输出将是:

Current Letter: j
Current Letter: a
Current Letter: n
Current Letter: g
Current Letter: o

它继续到循环的下一个迭代。


1
在过去的三到四天里,我一直在思考,为什么我需要“继续”声明,然后遇到这篇文章,这反过来又有助于我进行一些质量检查-非常感谢!
弗雷迪

3
同样,在这里,当我们编写python脚本(用于cron作业)并在大值上进行迭代并且发生某些异常时,cron作业将被停止,并且您只能知道第二天,在这种情况下,它确实有很大帮助,是的我们可以在异常情况下编写发送邮件功能,但仍然会停止执行。
塞纳尔·帕尔玛

2
这说明了continue您可以做什么,但是它并不过分有用if letter != 'D': print 'Current Letter:', letter
Chris_Rands

我会选择“祈祷/删除r”或“快速/删除s”。
本杰明·克鲁兹耶

101

我喜欢使用continue in loops,在您陷入“倒闭”之前,要完成许多竞争。因此,而不是像这样的代码:

for x, y in zip(a, b):
    if x > y:
        z = calculate_z(x, y)
        if y - z < x:
            y = min(y, z)
            if x ** 2 - y ** 2 > 0:
                lots()
                of()
                code()
                here()

我得到这样的代码:

for x, y in zip(a, b):
    if x <= y:
        continue
    z = calculate_z(x, y)
    if y - z >= x:
        continue
    y = min(y, z)
    if x ** 2 - y ** 2 <= 0:
        continue
    lots()
    of()
    code()
    here()

通过这种方式,我避免了嵌套很深的代码。另外,通过先消除最常发生的情况来优化循环很容易,因此,当没有其他显示异常时,我只需要处理不常见但很重要的情况(例如,除数为0)。


2
因此,“ continue”主要用于通过减少缩进来提高可读性。我想知道“继续”是否增加了任何表现力。
JohnG 2011年

13
使用continue这种方式类似于使用GOTO。但是,这是正确的使用方法GOTO
dotancohen

1
@JohnG我不相信没有它的情况下无法复制continue(或break),尽管在运行时没有它会很昂贵。
Sparr 2014年

18

通常情况下,需要继续/有用的情况是当您想跳过循环中的其余代码并继续迭代时。

我真的不认为这是必要的,因为您可以始终使用if语句来提供相同的逻辑,但是对于提高代码的可读性可能会很有用。


23
请注意,使用if <condition>: continue而不是if not <condition>: ...避免在不使用缩进级别的情况下就需要缩进级别。
Dan D.

1
我本来打算发布与JohnG类似的qn,但后来发现他已经问过我想知道的内容。仔细阅读这里的所有响应都可以帮助您,但是我仍然需要确定一件事-就是每当我们使用一条continue语句时,我们实际上就跳出了条件测试部分,并允许循环的迭代继续进行到下一次迭代?在我看来,这比使用更好else。仅仅是为了提高可读性和运行时性能?
AKKO 2014年

“我不认为这是必要的”……好吧,python的创建者们则相反。
让·弗朗索瓦·法布尔

12
import random  

for i in range(20):  
    x = random.randint(-5,5)  
    if x == 0: continue  
    print 1/x  

继续是一个非常重要的控制声明。上面的代码表示一种典型的应用,其中可以避免除以零的结果。当我需要存储程序的输出时,我经常使用它,但是如果程序崩溃,我不想存储输出。请注意,要测试上面的示例,请用print 1 / float(x)替换最后一个语句,否则只要有小数,您就会得到零,因为randint返回一个整数。为了清楚起见,我省略了它。


9

有人对可读性发表了评论,说:“哦,它对可读性的帮助不大,谁在乎呢?”

假设您需要在主代码之前进行检查:

if precondition_fails(message): continue

''' main code here '''

请注意,您可以在之后执行此操作在编写主代码而无论如何都不会更改该代码。如果您区分代码,因为主代码没有间距变化,因此只会突出显示带有“继续”的添加行。

试想一下,如果您必须对生产代码进行断点修补,那么结果发现这仅仅是在添加一个行,并继续。显而易见,这是您查看代码时唯一的更改。如果您开始将主代码包装在if / else中,则diff将突出显示新缩进的代码,除非您忽略间距更改,这在Python中尤其危险。我认为除非您一直处于必须在短时间内推出代码的情况,否则您可能不会完全理解这一点。


5
def filter_out_colors(elements):
  colors = ['red', 'green']
  result = []
  for element in elements:
    if element in colors:
       continue # skip the element
    # You can do whatever here
    result.append(element)
  return result

  >>> filter_out_colors(['lemon', 'orange', 'red', 'pear'])
  ['lemon', 'orange', 'pear']

4
但是continue语句这里添加了什么?可以通过使用消除它element not in colors,并且代码将具有可读性。
ekhumoro 2011年

4

假设我们要打印所有不是3和5的倍数的数字

for x in range(0, 101):
    if x % 3 ==0 or x % 5 == 0:
        continue
        #no more code is executed, we go to the next number 
    print x

您也可以只使用if x %3 == 0 or x % 5 == 0:passelse:print x
通配符

正确的方法是使用continue或not运算符。为什么不必要使用通行证?
ytpillai

我更喜欢您的方式(因此表示赞成)。我来到此页面试图找出是否需要使用continue。我的结论是,永远都不需要,但是在某些情况下(如这种情况),使用可以使代码更具可读性continue。这是一个很好的例子。
通配符

3

这不是绝对必要的,因为它可以使用IF来完成,但是它更具可读性,并且运行时成本更低。

如果数据不符合某些要求,我将其用于跳过循环中的迭代:

# List of times at which git commits were done.
# Formatted in hour, minutes in tuples.
# Note the last one has some fantasy.
commit_times = [(8,20), (9,30), (11, 45), (15, 50), (17, 45), (27, 132)]

for time in commit_times:
    hour = time[0]
    minutes = time[1]

    # If the hour is not between 0 and 24
    # and the minutes not between 0 and 59 then we know something is wrong.
    # Then we don't want to use this value,
    # we skip directly to the next iteration in the loop.
    if not (0 <= hour <= 24 and 0 <= minutes <= 59):
        continue

    # From here you know the time format in the tuples is reliable.
    # Apply some logic based on time.
    print("Someone commited at {h}:{m}".format(h=hour, m=minutes))

输出:

Someone commited at 8:20
Someone commited at 9:30
Someone commited at 11:45
Someone commited at 15:50
Someone commited at 17:45

如您所见,在continue语句后没有出现错误的值。


ifcontinue如果所有代码都包含在一个块中,则只能做什么。continue跳过甚至在if块外的代码。
bryc

为什么小时不包括24,但分钟不包括60?
帕特里克·阿特纳

没有特殊的原因,仅举一个例子,可以随时进行编辑
巴斯蒂安

1

例如,如果您想根据变量的值做不同的事情:

my_var = 1
for items in range(0,100):
    if my_var < 10:
        continue
    elif my_var == 10:
        print("hit")
    elif my_var > 10:
        print("passed")
    my_var = my_var + 1

在上面的示例中,如果使用break解释器,则将跳过循环。但是使用continue它仅跳过if-elif语句并直接转到循环的下一项。


3
您的示例将永远不会打印任何内容,因为第一个条件始终为true。假设对于初始值my_var0
Dan D.

我只是改编了我的旧代码示例。var的原始值不为0,为方便起见添加了递增部分,因为它的原始位置不存在。由于这是一个示例,并且它的值并不重要,所以我认为可以。
jonathan.hepp

9
不好 这不是使用的好广告continue
John Machin

3
第一个elif应该是if。该代码只是不能使您看起来自己知道自己在做什么。
约翰·马钦

这是一个不好的例子
帕特里克

0

continue 只需跳过循环中的其余代码,直到下一次迭代

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.