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


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

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

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

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

9 125

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

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

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

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

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

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

import random  

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

продолжить-это чрезвычайно важный оператор управления. Приведенный выше код указывает на типичное приложение, в котором можно избежать результата деления на ноль. Я часто использую его, когда мне нужно сохранить вывод из программ, но не хочу хранить вывод, если программа разбилась. Обратите внимание, чтобы проверить приведенный выше пример, замените последний оператор на 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 заявление.