Визначення з continue
твердження:
continue
Затвердження продовжується з наступної ітерації циклу.
Я не можу знайти хороших прикладів коду.
Чи може хтось запропонувати кілька простих випадків, коли continue
це необхідно?
Визначення з continue
твердження:
continue
Затвердження продовжується з наступної ітерації циклу.
Я не можу знайти хороших прикладів коду.
Чи може хтось запропонувати кілька простих випадків, коли continue
це необхідно?
Відповіді:
Ось простий приклад:
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
робить, але це не надто корисно, коли можна було зробитиif letter != 'D': print 'Current Letter:', letter
Мені подобається використовувати продовження в циклі, де існує багато умов, які потрібно виконати, перш ніж ви перейдете до справи. Тож замість такого коду:
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), коли немає іншого шоустоппера.
continue
таким чином подібне до використання GOTO
. Однак це правильний спосіб використання GOTO
.
Зазвичай ситуація, коли продовжувати потрібно / корисно, полягає в тому, коли потрібно пропустити залишився код у циклі і продовжити ітерацію.
Я не дуже вірю, що це потрібно, оскільки ви завжди можете використовувати, якщо оператори забезпечують ту саму логіку, але це може бути корисно для збільшення читабельності коду.
if <condition>: continue
а не if not <condition>: ...
уникнення рівня відступу, який інакше був би необхідний, якби він був написаний без нього.
continue
заяву, ми по суті вискакуємо з розділу умовного тестування і дозволяємо ітерації циклу продовжуватись до наступної ітерації? Мені не видно, як це було б краще, ніж використовувати else
. Це просто все про покращену читабельність та продуктивність під час виконання?
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 '''
Зауважте, що це можна зробити після написання основного коду, не змінюючи цього коду. Якщо ви відрізняєте код, виділятиметься лише доданий рядок із "продовжити", оскільки зміни між основним кодом немає.
Уявіть, що вам доведеться зробити виправлення виробничого коду, який, як виявляється, просто додає рядок із продовженням. Неважко помітити, що це єдина зміна, коли ви переглядаєте код. Якщо ви почнете вставляти основний код у 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']
continue
твердження ? Його можна усунути за допомогою , і код був би таким же читабельним. element not in colors
Скажімо, ми хочемо надрукувати всі числа, не кратні 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
continue
. Мій висновок полягає в тому, що ніколи не виникає потреби , але в деяких випадках (наприклад, цей) код є більш читабельним за допомогою continue
. Це дуже хороший приклад.
Це не є абсолютно необхідним, оскільки це можна зробити за допомогою ІФ, але це зручніше для читання, а також дешевше за час роботи.
Я використовую його для того, щоб пропустити ітерацію в циклі, якщо дані не відповідають деяким вимогам:
# 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
блоком.
Наприклад, якщо ви хочете робити різні речі залежно від значення змінної:
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 і переходить безпосередньо до наступного пункту циклу.
my_var
з 0
.
continue
.
elif
має бути ан if
. Код просто не дає вигляду, що ви знаєте, що робите.