มีความแตกต่างระหว่าง `ดำเนินการต่อ 'และ' ผ่าน 'ในห่วงสำหรับงูหลามใน?


274

มีความแตกต่างอย่างมีนัยสำคัญระหว่างสองคำหลาม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)ในเอกสารหลามทำให้ฉันสับสนในทางที่ฉันไม่พบว่ามันชัดเจนว่าสภาพอากาศที่มันทำงานได้เทียบเท่ากับการดำเนินการต่อในกรณีนี้หรือสิ่งอื่นที่ตั้งใจ ประโยคแรก"คำสั่ง pass ไม่ได้ทำอะไรเลย" อธิบายลักษณะทั้งหมดของคำตอบสำหรับคำถามของฉัน แต่อย่างใดมันก็ไม่ได้ตาของฉัน
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
ฉันเห็นด้วยกับคำตอบของคุณโดยสิ้นเชิง แต่ฉันยังคงมีคำถามเกี่ยวกับคำหลัก pass หรือไม่จำเป็น? และจำเป็น แต่ทำไม ขอบคุณ
Hardik Gajjar

34
@HardikGajjar: เนื่องจากpassคำหลักไม่ได้ทำอะไรเลยมันมีประโยชน์เฉพาะเมื่อคุณต้องมีชุดข้อความที่เยื้องเข้ามา แต่ไม่ต้องการทำอะไรเลย except SomeException: passตัวอย่างที่พบบ่อยคือถ้าคุณต้องการที่จะไม่สนใจข้อยกเว้นบางอย่างที่คุณใช้ มีกรณีการใช้งานอื่น ๆ อีกมากมายเช่นกัน คุณไม่จำเป็นต้องใช้คำหลักอย่างเคร่งครัดเนื่องจากคุณสามารถใช้คำสั่งอื่นใดที่ไม่ได้ทำอะไรเลย (เช่น0เป็นคำสั่งที่ถูกต้องสมบูรณ์แบบที่ไม่มีผลกระทบ) แต่การมีคำหลักสำหรับเรื่องนี้ทำให้คุณสามารถ ชัดเจนมากขึ้นเกี่ยวกับการไม่ต้องการทำอะไร
Sven Marnach

@SvenMarnach มันขมวดคิ้วอย่างมีสไตล์เพื่อรักษาข้อยกเว้นด้วยpass?
Bjorks เป็นแฟนหมายเลขหนึ่ง

@ MikePalmice ไม่เลย
Matt M.

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จะดำเนินการต่อ

ถ้า pass อยู่ที่ท้ายของ loop ความแตกต่างนั้นเล็กน้อยเนื่องจาก flow จะกลับไปที่ด้านบนของ loop อย่างไรก็ตาม


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เป็นข้อความว่างเปล่าที่ไม่ทำอะไรเลย

ดูเอกสารหลาม


4

ในตัวอย่างเหล่านั้นไม่มี หากคำสั่งไม่ได้อยู่ในลูปสุดท้ายพวกเขาจะมีเอฟเฟกต์ที่แตกต่างกันมาก


3

ความแตกต่างระหว่าง pass และการวนรอบต่อไป:

เหตุใดจึงผ่านไปในงูหลาม

ถ้าคุณต้องการสร้างคลาสว่างวิธีการหรือบล็อก

ตัวอย่าง:

class MyException(Exception):
    pass


try:
   1/0
 except:
   pass

โดยไม่มี 'pass' ในตัวอย่างด้านบนจะทำให้ 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."

ผลลัพธ์คือ

>>> 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
ความแตกต่างพิเศษกับคำตอบอื่น ๆ มีอยู่แล้วแล้ว?
BHUVANESH MOHANKUMAR

1

พิจารณาด้วยวิธีนี้:

ผ่าน:หลามทำงานอย่างหมดจดในการเยื้อง! ไม่มีวงเล็บปีกกาว่างเปล่าซึ่งแตกต่างจากภาษาอื่น ๆ

ดังนั้นหากคุณต้องการทำอะไรในกรณีที่เงื่อนไขเป็นจริงไม่มีตัวเลือกอื่นนอกจากรหัสผ่าน

ดำเนินการต่อ:สิ่งนี้มีประโยชน์เฉพาะในกรณีของลูป ในกรณีสำหรับช่วงของค่าคุณไม่ต้องการดำเนินการคำสั่งที่เหลือของลูปหลังจากเงื่อนไขนั้นเป็นจริงสำหรับการส่งผ่านนั้นคุณจะต้องใช้ดำเนินการต่อ


ดังนั้นหากคุณต้องการที่จะไม่ทำอะไรเลยในกรณีที่เงื่อนไขเป็นจริงไม่มีตัวเลือกอื่นนอกจาก pass -> นี่ไม่ถูกต้องให้ดูเช่นความคิดเห็นของ Sven Marnach ด้านบน
แพทริค

1
@patrick ขออภัย แต่เขาก็ถูกต้อง ในกรณีที่ตัวอย่างเช่นตัวแปรสามารถเป็นทั้ง float และ int และคุณต้องการดำเนินการกับ ints ทั้งหมดจากนั้นคุณสามารถใช้คำสั่ง if ที่ตรวจสอบการลอยใช้passคำสั่ง if และดำเนินการถ้ามันเป็นTrue Falseทำให้สามารถสแกนรายการอเนกประสงค์ได้อย่างมีประสิทธิภาพ
1313e

0

passสามารถใช้ในสถานการณ์เมื่อคุณต้องการฟังก์ชั่นที่ว่างเปล่าบางคลาสหรือลูปสำหรับการใช้งานในอนาคตและไม่มีความต้องการของการดำเนินการรหัสใด ๆ
continueจะใช้ในสถานการณ์เมื่อไม่มีเมื่อเงื่อนไขบางอย่างเกิดขึ้นภายในลูปและคุณต้องข้ามการวนซ้ำปัจจุบันและเลื่อนไปยังอันถัดไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.