Пример использования оператора "continue" в Python? - PullRequest
158 голосов
/ 07 декабря 2011

Определение оператора continue:

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

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

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

Ответы [ 9 ]

197 голосов
/ 05 мая 2014

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

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

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

96 голосов
/ 07 декабря 2011

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

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.

17 голосов
/ 07 декабря 2011

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

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

12 голосов
/ 20 июня 2013
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 возвращает целое число.Я пропустил это для ясности.

9 голосов
/ 09 июля 2015

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

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

if precondition_fails(message): continue

''' main code here '''

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

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

5 голосов
/ 07 декабря 2011
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 голосов
/ 01 июня 2015

Допустим, мы хотим напечатать все числа, которые не кратны 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
3 голосов
/ 02 октября 2015

Это не является абсолютно необходимым, так как это можно сделать с помощью 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.

2 голосов
/ 07 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...