Czy istnieje różnica między `Kontynuuj` i` pass` w pętli for w pythonie?


274

Czy istnieje jakaś znacząca różnica między dwoma słowami kluczowymi w Pythonie continuei passjak w przykładach

for element in some_list:
    if not element:
        pass

i

for element in some_list:
    if not element:
        continue

Powinienem być tego świadomy?


4
@ S.Lott: Przykład: while True:; pass # Busy-wait for keyboard interrupt (Ctrl+C)w python docs pomyliłem mnie w ten sposób, że nie uważałem, że jest czysta pogoda, że ​​zachowuje się tak samo, aby kontynuować w tym przypadku lub coś innego było zamierzone. Pierwsze zdanie „Instrukcja pass nic nie robi”. charakteryzuje wszystkie odpowiedzi na moje pytanie, ale jakoś nie przykuło mnie to uwagę.
Aufwind

Odpowiedzi:


400

Tak, robią zupełnie inne rzeczy. passpo prostu nic nie robi, continuekontynuując iterację następnej pętli. W twoim przykładzie różnica stanie się widoczna, jeśli dodasz inną instrukcję po if: Po wykonaniu pass, ta kolejna instrukcja zostanie wykonana. Później continuenie.

>>> a = [0, 1, 2]
>>> for element in a:
...     if not element:
...         pass
...     print element
... 
0
1
2
>>> for element in a:
...     if not element:
...         continue
...     print element
... 
1
2

7
całkowicie zgadzam się z twoją odpowiedzią. ale wciąż mam pytanie dotyczące hasła kluczowego, czy jest potrzebne? i potrzebne, ale dlaczego? Dziękuję
Hardik Gajjar,

34
@HardikGajjar: Ponieważ passsłowo kluczowe nic nie robi, jest użyteczne tylko wtedy, gdy składniowo potrzebujesz wciętego pakietu, ale nie chcesz nic robić. Typowym przykładem jest użycie ignorowanego wyjątku except SomeException: pass. Istnieje również wiele innych przypadków użycia. Nie potrzebujesz do tego ściśle słowa kluczowego, ponieważ możesz użyć dowolnego innego wyrażenia, które nic nie robi (np. 0Jest całkowicie poprawnym stwierdzeniem, które nie ma efektu), ale posiadanie słowa kluczowego do tego pozwala ci być wyraźniej mówiąc o tym, że nie chcę nic robić.
Sven Marnach,

@ SvvenMarnach czy to stylowe, że traktuje się wyjątki pod względem stylistycznym pass?
Fan Bjorks numer jeden

@MikePalmice Wcale nie.
Matt M.

73

Tak, jest różnica. continuewymusza uruchomienie pętli przy następnej iteracji, a jednocześnie passoznacza, że ​​„nie ma tu kodu do wykonania” i będzie kontynuował przez resztę lub treść pętli.

Uruchom je i zobacz różnicę:

for element in some_list:
    if not element:
        pass
    print 1 # will print after pass

for element in some_list:
   if not element:
       continue
   print 1 # will not print after continue

23

continueprzeskoczy z powrotem na szczyt pętli. passbędzie kontynuować przetwarzanie.

jeśli pass jest na końcu dla pętli, różnica jest znikoma, ponieważ przepływ i tak powróciłby na samą górę pętli.


11

W twoim przykładzie nie będzie różnicy, ponieważ obie instrukcje pojawiają się na końcu pętli. passjest po prostu symbolem zastępczym, ponieważ nic nie robi ( przekazuje wykonanie do następnej instrukcji). continuez drugiej strony ma określony cel: nakazuje pętli kontynuowanie tak, jakby dopiero się zrestartowała.

for element in some_list:
    if not element:
        pass
    print element  

jest bardzo różny od

for element in some_list:
    if not element:
        continue
    print element

6

Istnieje między nimi różnica,
continuepomija bieżącą iterację pętli i wykonuje następną iterację.
passnic nie robi. Jest to symbol zastępczy pustego wyciągu.
Wolę raczej podać przykład, który lepiej to wyjaśni.

>>> for element in some_list:
...     if element == 1:
...         print "Pass executed"
...         pass
...     print element
... 
0
Pass executed
1
2

>>> for element in some_list:
...     if element == 1:
...         print "Continue executed"
...         continue
...     print element
... 
0
Continue executed
2

5

Tak, jest różnica. Continuefaktycznie pomija resztę bieżącej iteracji pętli (wracając do początku). Passjest pustym stwierdzeniem, które nic nie robi.

Zobacz dokumentację Pythona



3

Różnica między przejściem a kontynuacją w pętli for:

Po co więc przekazywać pytona?

Jeśli chcesz utworzyć pustą klasę, metodę lub blok.

Przykłady:

class MyException(Exception):
    pass


try:
   1/0
 except:
   pass

bez „pass” w powyższych przykładach wyrzuci IndentationError.


1
x = [1,2,3,4] 
for i in x:
    if i==2:
         pass  #Pass actually does nothing. It continues to execute statements below it.
         print "This statement is from pass."
for i in x:
    if i==2:
         continue #Continue gets back to top of the loop.And statements below continue are executed.
         print "This statement is from continue."

Dane wyjściowe to

>>> This statement is from pass.

Ponownie uruchommy ten sam kod z niewielkimi zmianami.

x = [1,2,3,4]
for i in x:
    if i==2:
       pass  #Pass actually does nothing. It continues to execute statements below it.
    print "This statement is from pass."
for i in x:
    if i==2:
        continue #Continue gets back to top of the loop.And statements below continue are executed.
    print "This statement is from continue."

Dane wyjściowe to -

>>> This statement is from pass.
This statement is from pass.
This statement is from pass.
This statement is from pass.
This statement is from continue.
This statement is from continue.
This statement is from continue.

Pass nic nie robi. Nie ma to wpływu na obliczenia. Ale kontynuuj wraca na początek pętli, aby przejść do następnego obliczenia.


3
Jaka jest szczególna różnica w porównaniu z innymi dostępnymi odpowiedziami?
BHUVANESH MOHANKUMAR

1

Rozważ to w ten sposób:

Podanie: Python działa wyłącznie na wcięcia! W przeciwieństwie do innych języków nie ma pustych nawiasów klamrowych.

Tak więc, jeśli nie chcesz nic robić w przypadku, gdy warunek jest spełniony, nie ma innej opcji niż przejście.

Kontynuuj: Jest to przydatne tylko w przypadku pętli. W przypadku, gdy dla zakresu wartości nie chcesz wykonać pozostałych instrukcji pętli po spełnieniu tego warunku dla tego konkretnego przejścia, musisz użyć polecenia Kontynuuj.


Jeśli więc nie chcesz nic robić w przypadku, gdy warunek jest spełniony, nie ma innej opcji niż podanie -> to nie jest dokładne, patrz np. Komentarz Svena Marnacha powyżej.
Patrick

1
@patrick Przepraszamy, ale ma rację. W przypadku, gdy na przykład zmienną może być zarówno liczba zmiennoprzecinkowa, jak i liczba całkowita, a chcesz wykonać operację na wszystkich liczbach całkowitych, możesz po prostu użyć instrukcji if, która sprawdza, passczy liczba zmienna jest zmienna, użyj instrukcji if Truei wykonaj operację, jeśli jest False. Pozwala to na wydajne skanowanie list wielofunkcyjnych.
1313e

0

passmoże być stosowany w scenariuszach, w których potrzebne są puste funkcje, klasy lub pętle do przyszłych implementacji i nie ma potrzeby wykonywania żadnego kodu.
continuejest używany w scenariuszach, gdy nie, gdy jakiś warunek został spełniony w pętli i musisz pominąć bieżącą iterację i przejść do następnej.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.