Приклад використання оператора «продовження» в Python?


177

Визначення з continueтвердження:

continueЗатвердження продовжується з наступної ітерації циклу.

Я не можу знайти хороших прикладів коду.

Чи може хтось запропонувати кілька простих випадків, коли continueце необхідно?

Відповіді:


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 буде зупинена, і ви зможете знати лише, що наступного дня це дійсно дуже допомагає в цьому випадку, так ми можемо написати функцію надсилання пошти за винятком, але все-таки виконання буде зупинено.
Snehal Parmar

2
Це ілюструє те, що continueробить, але це не надто корисно, коли можна було зробитиif letter != 'D': print 'Current Letter:', letter
Chris_Rands,

Я вибрав би Молитися / видалити r або Швидко / видалити 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), коли немає іншого шоустоппера.


2
Тож "продовжувати" використовується здебільшого для читабельності за рахунок зменшення відступу. Мені цікаво, чи «продовжувати» додає якусь виразну силу.
JohnG

14
Використовувати continueтаким чином подібне до використання GOTO. Однак це правильний спосіб використання GOTO.
dotancohen

1
@JohnG Я не вірю, що для цього не існує можливості продовження (або перерви), яке без нього неможливо відтворити, хоча його відсутність може бути дорогою під час роботи.
Спарр

18

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

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


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 повертає ціле число. Я пропустив це для наочності.


10

Деякі люди коментують читабельність, кажучи: "О, це не дуже допомагає читабельності, кого це хвилює?"

Припустимо, вам потрібна перевірка перед основним кодом:

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
екхуморо

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:, pass, else:,print x
Джокер

Правильний спосіб - використовувати або продовжувати, або не оператора. Чому надмірно використовувати пропуск?
ytpillai

Мені подобається твій шлях краще (звідси і нагорода). Я зайшов на цю сторінку, намагаючись розібратися, чи є коли-небудь потреба у використанні continue. Мій висновок полягає в тому, що ніколи не виникає потреби , але в деяких випадках (наприклад, цей) код є більш читабельним за допомогою continue. Це дуже хороший приклад.
Wildcard

3

Це не є абсолютно необхідним, оскільки це можна зробити за допомогою ІФ, але це зручніше для читання, а також дешевше за час роботи.

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

# 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блоком.
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
ваш приклад ніколи нічого не надрукує, оскільки перша умова завжди справджується. за умови , початкове значення my_varз 0.
Ден Д.

Я просто адаптував приклад старого мого коду. Первісна вартість var не 0, і збільшується частина була додана для зручності, оскільки її початкового місця там не було. Оскільки це приклад і його значення насправді не має значення, я думаю, це нормально.
jonathan.hepp

9
Це не нормально. Це не гарна реклама для використання continue.
Джон Махін

3
І першим elifмає бути ан if. Код просто не дає вигляду, що ви знаєте, що робите.
Джон Махін

це поганий приклад
патрік

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.