Przykładowe użycie instrukcji „continue” w Pythonie?

177

Definicja tego continuejest stwierdzenie:

continueOświadczenie kontynuuje następnej iteracji pętli.

Nie mogę znaleźć żadnych dobrych przykładów kodu.

Czy ktoś mógłby zasugerować kilka prostych przypadków, w których continuejest to konieczne?

JohnG
źródło

Odpowiedzi:

218

Oto prosty przykład:

for letter in 'Django':    
    if letter == 'D':
        continue
    print("Current Letter: " + letter)

Wynik będzie:

Current Letter: j
Current Letter: a
Current Letter: n
Current Letter: g
Current Letter: o

Kontynuuje do następnej iteracji pętli.

Snehal Parmar
źródło
1
Przez ostatnie trzy lub cztery dni zastanawiałem się, dlaczego miałbym kiedykolwiek potrzebować oświadczenia „kontynuuj”, a potem natrafiłem na ten post, który z kolei pomaga mi w pewnej kontroli jakości - wielkie dzięki!
Freddy
3
to samo tutaj, kiedy piszemy skrypt w Pythonie (dla zadania cron) i iterujemy na dużych wartościach i pojawia się jakiś wyjątek, zadanie crona zostanie zatrzymane i będziesz mógł wiedzieć, że następnego dnia naprawdę bardzo pomaga w tym przypadku, Tak możemy napisać funkcję wysyłania poczty na wyjątek, ale wykonanie zostanie zatrzymane.
Snehal Parmar
2
To ilustruje, co continuerobi, ale nie jest zbyt przydatne, kiedy można to zrobićif letter != 'D': print 'Current Letter:', letter
Chris_Rands
Wybrałbym Módl się / usuń r lub Szybko / usuń s.
Benjamin Crouzier
102

Lubię używać kontynuacji w pętlach, w których jest wiele wymagań, które należy spełnić, zanim przejdziesz do rzeczy. Więc zamiast takiego kodu:

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()

Otrzymuję taki kod:

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()

Robiąc to w ten sposób, unikam bardzo głęboko zagnieżdżonego kodu. Ponadto łatwo jest zoptymalizować pętlę, eliminując najpierw najczęściej występujące przypadki, tak że mam do czynienia tylko z rzadkimi, ale ważnymi przypadkami (np. Dzielnik wynosi 0), gdy nie ma innego showstoppera.

Lauritz V. Thaulow
źródło
2
Dlatego „kontynuuj” jest używane głównie ze względu na czytelność, ponieważ zmniejsza wcięcia. Zastanawiam się, czy „kontynuuj” dodaje mocy ekspresji.
JohnG,
14
Używanie continuew ten sposób jest podobne do używania GOTO. Jest to jednak właściwy sposób użycia GOTO.
dotancohen
1
@JohnG Nie wierzę, że jest użycie kontynuacji (lub przerwy, jeśli o to chodzi), której nie można by bez niej odtworzyć, chociaż brak jej może być kosztowny w czasie wykonywania.
Sparr
18

Zazwyczaj sytuacja, w której continue jest konieczne / przydatne, ma miejsce, gdy chcesz pominąć pozostały kod w pętli i kontynuować iterację.

Naprawdę nie uważam, że jest to konieczne, ponieważ zawsze można użyć instrukcji if, aby zapewnić tę samą logikę, ale może to być przydatne, aby zwiększyć czytelność kodu.

pcalcao
źródło
23
Zwróć uwagę, że użycie if <condition>: continueraczej niż if not <condition>: ...pozwala uniknąć poziomu wcięcia, który byłby potrzebny, gdyby został napisany bez niego.
Dan D.
1
Miałem właśnie zamieścić podobne pytanie do JohnG, ale potem okazało się, że już zapytał, co chciałem wiedzieć. Przeczytanie wszystkich odpowiedzi tutaj pomogło, ale nadal muszę być pewien jednej rzeczy - tak jest, że za każdym razem, gdy używamy continueinstrukcji, zasadniczo wyskakujemy z sekcji testowania warunkowego i pozwalamy, aby iteracja pętli była kontynuowana do następnej iteracji? Nie jest dla mnie oczywiste, jak byłoby to lepsze niż używanie else. Czy chodzi tylko o lepszą czytelność i wydajność w czasie wykonywania?
AKKO,
„Nie wierzę, że to konieczne”… no cóż, twórcy Pythona myśleli inaczej.
Jean-François Fabre
12
import random  

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

Kontynuuj to niezwykle ważne oświadczenie kontrolne. Powyższy kod wskazuje na typowe zastosowanie, w którym można uniknąć wyniku dzielenia przez zero. Używam go często, gdy muszę przechowywać dane wyjściowe z programów, ale nie chcę przechowywać danych wyjściowych, jeśli program się zawiesił. Uwaga, aby przetestować powyższy przykład, zamień ostatnią instrukcję na print 1 / float (x), w przeciwnym razie otrzymasz zera za każdym razem, gdy występuje ułamek, ponieważ randint zwraca liczbę całkowitą. Pominąłem to dla jasności.

user1871712
źródło
10

Niektórzy ludzie komentowali czytelność, mówiąc: „Och, to wcale nie poprawia czytelności, kogo to obchodzi?”

Załóżmy, że potrzebujesz czeku przed głównym kodem:

if precondition_fails(message): continue

''' main code here '''

Pamiętaj, że możesz to zrobić później głównego kodu bez zmiany tego kodu w żaden sposób. Jeśli porównasz kod, tylko dodana linia z "kontynuuj" będzie podświetlona, ​​ponieważ nie ma zmian odstępów w głównym kodzie.

Wyobraź sobie, że musisz zrobić breakfix kodu produkcyjnego, który okazuje się po prostu dodaniem linii z kontynuacją. Łatwo zauważyć, że to jedyna zmiana podczas przeglądania kodu. Jeśli zaczniesz zawijać główny kod w if / else, diff podświetli nowo wcięty kod, chyba że zignorujesz zmiany odstępów, co jest niebezpieczne szczególnie w Pythonie. Myślę, że jeśli nie byłeś w sytuacji, w której musisz wdrożyć kod w krótkim czasie, możesz nie w pełni to docenić.

CS
źródło
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']
ILYA Khlopotov
źródło
4
Ale co tu dodajecontinue oświadczenie ? Można go wyeliminować za pomocą , a kod byłby równie czytelny. element not in colors
ekhumoro,
4

Powiedzmy, że chcemy wypisać wszystkie liczby, które nie są wielokrotnościami 3 i 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
ytpillai
źródło
Można też po prostu użyć if x %3 == 0 or x % 5 == 0:, pass, else:,print x
Wildcard
Prawidłowym sposobem jest użycie operatora continue lub not. Po co niepotrzebnie używać przepustki?
ytpillai
Twój sposób bardziej mi się podoba (stąd wynik pozytywny). Doszedłem do tej strony próbuje uporządkować jeśli istnieje kiedykolwiek potrzeba używać continue. Mój wniosek jest taki, że nigdy nie ma takiej potrzeby , ale w niektórych przypadkach (takich jak ten) kod jest bardziej czytelny przy użyciu continue. To bardzo dobry przykład.
Wildcard
3

Nie jest to absolutnie konieczne, ponieważ można to zrobić za pomocą IF, ale jest bardziej czytelne i tańsze w czasie wykonywania.

Używam go, aby pominąć iterację w pętli, jeśli dane nie spełniają pewnych wymagań:

# 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))

Wynik:

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

Jak widać, zła wartość nie pojawiła się po continueinstrukcji.

Bastian
źródło
ifmoże zrobić tylko to, co continuerobi, jeśli cały kod jest zawarty w bloku. continuepomija kod, który jest nawet poza ifblokiem.
bryc
dlaczego godzina 24 jest wliczona w cenę, a minuta to 60 minut ?
Patrick Artner
bez konkretnego powodu, tylko przykład, możesz edytować
Bastian
1

Na przykład, jeśli chcesz robić różne rzeczy w zależności od wartości zmiennej:

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

W powyższym przykładzie, jeśli użyję breakinterpretera, pominie pętlę. Ale z continuenim tylko pomija instrukcje if-elif i przechodzi bezpośrednio do następnego elementu pętli.

jonathan.hepp
źródło
3
Twój przykład nigdy niczego nie wypisze, ponieważ pierwszy warunek jest zawsze prawdziwy. zakładając początkową wartość dla my_varz 0.
Dan D.
Po prostu zaadaptowałem przykład mojego starego kodu. Oryginalna wartość zmiennej nie wynosi 0, a rosnąca część została dodana dla wygody, ponieważ jej pierwotnego miejsca nie było. Ponieważ jest to przykład, a jego wartość nie ma znaczenia, myślę, że jest w porządku.
jonathan.hepp
9
Nie jest w porządku. To nie jest dobra reklama do używania continue.
John Machin
3
A pierwszym elifpowinien być plik if. Kod po prostu nie daje wrażenia, że ​​wiesz, co robisz.
John Machin,
to jest zły przykład
patrick
0

continue po prostu pomija resztę kodu w pętli do następnej iteracji

Yanfeng Liu
źródło