Чи є різниця між `продовжити` та` пройти` у циклі for для python?


274

Чи є якась істотна різниця між двома ключовими словами python continueта passподібними у прикладах

for element in some_list:
    if not element:
        pass

і

for element in some_list:
    if not element:
        continue

Я повинен знати про це?


4
@ S.Lott: Приклад: while True:; pass # Busy-wait for keyboard interrupt (Ctrl+C)у програмі python мене збентежили в тому, що я не знайшов ясної погоди, він поводиться рівнозначно, щоб продовжуватись у цьому випадку, або щось інше було призначено. Перше речення "Ухвальний вислів нічого не робить". характеризує всі відповіді на моє запитання, але якимось чином не потрапив на очі.
Aufwind

Відповіді:


400

Так, вони роблять абсолютно різні речі. passпросто нічого не робить, поки continueпродовжується наступна ітерація циклу. У вашому прикладі різниця стане очевидною, якщо ви додали ще один вислів після if: Після виконання pass, цей подальший оператор буде виконаний. Після continueцього не буде.

>>> 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
я повністю згоден з вашою відповіддю. але у мене все ще виникає питання щодо ключового слова проходу, чи це потрібно? і потрібно, але навіщо? Дякую
Hardik Gajjar

34
@HardikGajjar: Оскільки passключове слово нічого не робить, воно корисне лише тоді, коли вам потрібен синтаксичний набір з відступом, але нічого не потрібно робити. Поширений приклад - якщо ви хочете ігнорувати якийсь виняток, ви використовуєте except SomeException: pass. Також є багато інших випадків використання. Для цього вам категорично не потрібно ключове слово, оскільки ви можете використовувати будь-який інший вислів, який нічого не робить (наприклад 0, ідеально правильне твердження, яке не має ефекту), але наявність ключового слова для цього дозволяє вам бути більш чітко про те, що нічого не хочуть робити.
Свен Марнах

@SvenMarnach це нахмурено стилістично обробляти винятки pass?
Вболівальник номер один Бьоркс

@MikePalmice Зовсім не.
Метт М.

73

Так, є різниця. continueзмушує цикл починатись із наступної ітерації, тоді як passозначає, що "тут немає коду для виконання", і продовжиться через залишок або тіло циклу.

Запустіть їх і побачите різницю:

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

continueвідскочить назад до вершини петлі. passпродовжить обробку.

якщо пропуск знаходиться в кінці для циклу, різниця незначна, оскільки потік все одно повернеться до вершини циклу.


11

У вашому прикладі різниці не буде, оскільки обидва твердження з’являються в кінці циклу. passце просто заповнювач, оскільки він нічого не робить (він передає виконання наступному оператору). continueз іншого боку, має певну мету: він повідомляє циклу продовжувати так, ніби він щойно перезапустився.

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

дуже відрізняється від

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

6

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

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

Так, є різниця. Continueфактично пропускає решту поточної ітерації циклу (повертаючись до початку). Passце порожнє твердження, яке нічого не робить.

Дивіться документи пітона



3

Різниця між пропуском і продовженням у циклі for:

То навіщо переходити в пітон?

Якщо ви хочете створити порожній клас, метод або блок.

Приклади:

class MyException(Exception):
    pass


try:
   1/0
 except:
   pass

без 'проходу' у наведених вище прикладах викине IndentaError.


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."

Вихід є

>>> This statement is from pass.

Знову дозвольте запустити той самий код із незначними змінами.

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."

Вихід -

>>> 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.

Пропуск нічого не робить. На обчислення це не впливає. Але продовження повертається до вершини циклу до наступного обчислення.


3
У чому особлива відмінність від інших вже доступних відповідей?
БХУВАНЕШ МОХАНКУМАР

1

Розглянемо це так:

Пас: Python працює виключно на відступ! Немає порожніх фігурних дужок на відміну від інших мов.

Тож, якщо ви не хочете нічого робити, якщо умова справжня, немає іншого варіанту, крім пропуску.

Продовжити: Це корисно лише у випадку циклів. У випадку, якщо для діапазону значень ви не хочете виконувати решта операторів циклу після того, як ця умова відповідає справжньому пропуску, тоді вам доведеться використовувати продовжити.


Отже, якщо ви не хочете нічого робити, якщо умова справжня, немає іншого варіанту, крім пропуску -> це не точно, дивіться, наприклад, коментар Свена Марнаха вище.
Патрік

1
@patrick Вибачте, але він прав. У випадку, коли, наприклад, змінна може бути як float, так і int, і ви хочете виконати операцію над усіма ints, тоді ви можете просто використовувати if-оператор, який перевіряє floats, використовуйте, passякщо оператор is Trueі виконайте операцію, якщо вона є False. Це дозволяє ефективно сканувати багатоцільові списки.
1313е

0

passможе використовуватися в сценаріях, коли вам потрібні деякі порожні функції, класи або цикли для майбутніх реалізацій, і немає необхідності виконувати будь-який код.
continueвикористовується в сценаріях, коли немає, коли в циклі виконується якась умова, і вам потрібно пропустити поточну ітерацію та перейти до наступної.

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