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

на определение на continue инструкция:

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

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

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

9 ответов


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

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

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


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

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


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

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


import random  

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

continue-чрезвычайно важный оператор управления. Приведенный выше код указывает на типичное приложение, где можно избежать результата деления на ноль. Я часто использую его, когда мне нужно сохранить вывод из программ, но не хочу хранить вывод, если программа разбилась. Обратите внимание, что для проверки приведенного выше примера замените последний оператор print 1/float(x), или вы получите нули всякий раз, когда есть дробь, так как randint возвращает целое число. Я опустил его на ясность.


некоторые люди прокомментировали читаемость, говоря: "о, это не помогает читаемости, кто заботится?"

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

if precondition_fails(message): continue

''' main code here '''

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

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


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']

допустим, мы хотим напечатать все числа, которые не кратны 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

например, если вы хотите делать разные вещи в зависимости от значения переменной:

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 и переходит непосредственно к следующему элементу цикла.


это не обязательно, так как это можно сделать с помощью IFs, но это более читаемо, а также дешевле во время выполнения.

Я использую его для того, чтобы пропустить итерацию в цикле, если данные не соответствуют некоторым требованиям:

# 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 заявление.