Пример использования оператора «continue» в Python?

177

Определение из continueутверждения:

continueУтверждение продолжается со следующей итерации цикла.

Я не могу найти хороших примеров кода.

Может ли кто-нибудь предложить несколько простых случаев, когда continueэто необходимо?

JohnG
источник

Ответы:

218

Вот простой пример:

for letter in 'Django':    
    if letter == 'D':
        continue
    print("Current Letter: " + letter)

Выход будет:

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

Это продолжается до следующей итерации цикла.

Снехал Пармар
источник
1
Последние три или четыре дня я размышлял, зачем мне когда-нибудь понадобиться заявление «продолжить», а потом я наткнулся на этот пост, который, в свою очередь, помогает мне с некоторым QA - большое спасибо!
Фредди
3
то же самое здесь, когда мы пишем скрипт на python (для задания cron) и выполняем итерации для больших значений, и возникает какое-то исключение, тогда задание cron будет остановлено, и вы сможете только знать, что на следующий день это действительно очень помогает в этом случае, да мы можем написать функцию отправки почты при исключении, но выполнение все равно будет остановлено.
Снехал Пармар
2
Это иллюстрирует то, что continueделает, но это не слишком полезно, когда вы могли бы сделатьif letter != 'D': print 'Current Letter:', letter
Chris_Rands
Я бы выбрал Pray / remove r или Fast / remove s.
Бенджамин Крузье
102

Мне нравится использовать продолжение в циклах, где нужно выполнить много заданий, прежде чем приступить к делу. Так что вместо кода вот так:

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), когда нет другого showtopper.

Лауриц В. Таулов
источник
2
Таким образом, «продолжить» используется в основном для удобства чтения путем уменьшения отступов. Мне интересно, добавляет ли «продолжение» какую-либо выразительную силу.
JohnG
14
Использование continueтаким образом похоже на использование GOTO. Тем не менее, это правильный способ использования GOTO.
dotancohen
1
@JohnG Я не верю, что есть какое-либо использование продолжения (или перерыва, если на то пошло), которое невозможно воспроизвести без него, хотя отсутствие его может быть дорогостоящим во время выполнения.
Спарр
18

Обычно ситуация, когда продолжить необходимо / полезно, это когда вы хотите пропустить оставшийся код в цикле и продолжить итерацию.

Я не очень верю, что это необходимо, так как вы всегда можете использовать операторы if для обеспечения одинаковой логики, но это может быть полезно для повышения читабельности кода.

pcalcao
источник
23
обратите внимание, что использование, if <condition>: continueа не if not <condition>: ...избегание уровня отступа, который в противном случае был бы необходим, если бы он был написан без него.
Дэн Д.
1
Я собирался опубликовать аналогичный Qn к JohnG, но потом обнаружил, что он уже спросил, что я хотел знать. Прочитать все ответы здесь помогло, но мне все еще нужно быть уверенным в одном - так что, всякий раз, когда мы используем continueоператор, мы по существу выпрыгиваем из секции условного тестирования и позволяем итерации цикла продолжить к следующей итерации? Мне не очевидно, как это было бы лучше, чем использовать else. Это только улучшенная читаемость и производительность во время выполнения?
АККО
«Я не верю, что это необходимо» ... ну, создатели питона думали иначе.
Жан-Франсуа Фабр
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 возвращает целое число. Я опустил это для ясности.

user1871712
источник
10

Некоторые люди прокомментировали читабельность, сказав: «О, это не так сильно помогает читаемости, кого это волнует?»

Предположим, вам нужна проверка перед основным кодом:

if precondition_fails(message): continue

''' main code here '''

Обратите внимание, что вы можете сделать это после как основной код был написан, не изменяя его в любом случае. Если вы измените код, будет подсвечена только добавленная строка с «продолжить», так как в основном коде нет пробелов.

Представьте, что вам нужно внести исправление в производственный код, который просто добавляет строку с помощью continue. Легко видеть, что это единственное изменение, когда вы просматриваете код. Если вы начнете переносить основной код в if / else, diff выделит новый код с отступом, если вы не игнорируете изменения пробелов, что особенно опасно в Python. Я думаю, что если вы не оказались в ситуации, когда вы должны выкатить код в кратчайшие сроки, вы можете не до конца оценить это.

CS
источник
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
Эхуморо
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
ytpillai
источник
Кроме того, можно просто использовать if x %3 == 0 or x % 5 == 0:, pass, else:,print x
Джокер
Правильный способ - использовать оператор continue или оператор not. Зачем излишне использовать пропуск?
ytpillai
Мне нравится твой путь лучше (отсюда и upvote). Я пришел на эту страницу, пытаясь разобраться, есть ли необходимость в использовании 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утверждения.

Бастиан
источник
ifможет делать только то, что continueделает, если весь код содержится в блоке. continueпропускает код, который находится даже за пределами ifблока.
17
почему 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 и переходите непосредственно к следующему элементу цикла.

jonathan.hepp
источник
3
ваш пример никогда ничего не напечатает, так как первое условие всегда верно. предполагая начальное значение для my_varоф 0.
Дэн Д.
Я просто адаптировал пример моего старого кода. Первоначальное значение переменной не равно 0, и увеличивающаяся часть была добавлена ​​для удобства, поскольку ее первоначальное место не было там. Так как это пример и его значение не имеет значения, я думаю, это нормально.
jonathan.hepp
9
Это не хорошо. Это не хорошая реклама для использования continue.
Джон Мачин
3
И первым elifдолжен быть if. Код просто не создает впечатление, что вы знаете, что делаете.
Джон Мачин
это плохой пример
Патрик
0

continue просто пропускает остальную часть кода в цикле до следующей итерации

Яньфэн Лю
источник