ตัวอย่างการใช้ข้อความ“ ดำเนินการต่อ” ใน Python หรือไม่


177

นิยามของcontinueคำสั่งคือ:

continueคำสั่งยังคงมีการย้ำต่อไปของวง

ฉันไม่พบตัวอย่างที่ดีของรหัส

มีคนแนะนำกรณีง่าย ๆ ที่continueจำเป็นไหม

คำตอบ:


218

นี่คือตัวอย่างง่ายๆ:

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

มันยังคงวนรอบถัดไปของการวนซ้ำ


1
ฉันกำลังคิดในช่วงสามหรือสี่วันที่ผ่านมาทำไมฉันจะต้องมีคำสั่ง 'ดำเนินการต่อ' และจากนั้นฉันวิ่งเข้าไปในโพสต์นี้ซึ่งจะช่วยให้ฉันมี QA - ขอบคุณมาก!
Freddy

3
เหมือนกันที่นี่เมื่อเราเขียนสคริปต์ไพ ธ อน (สำหรับงาน cron) และวนซ้ำในค่าที่มากและมีข้อยกเว้นเกิดขึ้นงาน cron จะหยุดและคุณสามารถรู้ได้ว่าในวันถัดไปมันช่วยได้มากในกรณีเหล่านั้นใช่ เราสามารถเขียนคุณลักษณะส่งเมลได้โดยมีข้อยกเว้น แต่การดำเนินการจะยังคงหยุดอยู่
Snehal Parmar

2
สิ่งนี้แสดงให้เห็นถึงสิ่งที่continueทำ แต่ไม่มีประโยชน์มากนักเมื่อคุณสามารถทำได้if letter != 'D': print 'Current Letter:', letter
Chris_Rands

ฉันจะเลือก Pray / remove r หรือ Fast / remove s
Benjamin Crouzier

102

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

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) เมื่อไม่มี showstopper อื่น ๆ


2
ดังนั้น "ทำต่อไป" จึงถูกใช้เป็นส่วนใหญ่เพื่อให้สามารถอ่านได้โดยลดการเยื้อง ฉันสงสัยว่า "ดำเนินการต่อ" จะเพิ่มพลังการแสดงออกใด ๆ
JohnG

14
ใช้ในแฟชั่นนี้จะคล้ายกับการใช้continue GOTOแต่นี้เป็นสิทธิGOTOวิธีการใช้
dotancohen

1
@ JohnG ฉันไม่เชื่อว่ามีการใช้งานใด ๆ ของการดำเนินการต่อ (หรือทำลายสำหรับเรื่องนั้น) ที่ไม่สามารถทำซ้ำโดยไม่ได้แม้ว่ามันจะไม่ได้มีราคาแพงในเวลาทำงาน
Sparr

18

โดยทั่วไปแล้วสถานการณ์ที่ต้องการดำเนินการต่อ / มีประโยชน์คือเมื่อคุณต้องการข้ามรหัสที่เหลือในลูปและทำซ้ำต่อ

ฉันไม่เชื่อจริง ๆ ว่าจำเป็นเพราะคุณสามารถใช้คำสั่งเพื่อให้ตรรกะเดียวกันเสมอ แต่มันอาจมีประโยชน์ในการเพิ่มความสามารถในการอ่านโค้ด


23
โปรดทราบว่าการใช้if <condition>: continueแทนที่จะif not <condition>: ...หลีกเลี่ยงระดับของการเยื้องที่จะเป็นอย่างอื่นที่จำเป็นถ้ามันถูกเขียนขึ้นโดยไม่ได้
Dan D.

1
ฉันกำลังจะโพสต์ qn ที่คล้ายกันกับ JohnG แต่แล้วก็พบว่าเขาได้ถามสิ่งที่ฉันอยากรู้แล้ว การอ่านคำตอบทั้งหมดที่นี่ได้ช่วย แต่ฉันยังต้องแน่ใจเกี่ยวกับสิ่งหนึ่ง - ดังนั้นเมื่อใดก็ตามที่เราใช้continueคำสั่งเราจะกระโดดออกจากส่วนการทดสอบตามเงื่อนไขและอนุญาตให้วนซ้ำเพื่อดำเนินการต่อ ในการทำซ้ำครั้งต่อไปหรือไม่ elseมันไม่ได้เป็นที่ชัดเจนให้กับฉันว่านี้จะดีกว่าการใช้ มันเป็นเพียงแค่ทั้งหมดเกี่ยวกับการปรับปรุงการอ่านและประสิทธิภาพเวลาทำงาน?
AKKO

"ฉันไม่เชื่อว่ามันจำเป็น" ... เอาละผู้สร้างหลามคิดอย่างอื่น
Jean-François Fabre

12
import random  

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

ดำเนินการต่อเป็นคำสั่งควบคุมที่สำคัญอย่างยิ่ง รหัสด้านบนแสดงถึงแอปพลิเคชันทั่วไปซึ่งสามารถหลีกเลี่ยงผลลัพธ์ของการหารด้วยศูนย์ได้ ฉันใช้มันบ่อยครั้งเมื่อฉันต้องการจัดเก็บผลลัพธ์จากโปรแกรม แต่ไม่ต้องการจัดเก็บผลลัพธ์หากโปรแกรมขัดข้อง หมายเหตุเพื่อทดสอบตัวอย่างข้างต้นแทนที่ statement ล่าสุดด้วย print 1 / float (x) หรือคุณจะได้ค่าศูนย์ทุกครั้งที่มีเศษส่วนเนื่องจาก randint ส่งคืนจำนวนเต็ม ฉันละเว้นมันเพื่อความชัดเจน


10

บางคนแสดงความคิดเห็นเกี่ยวกับความสามารถในการอ่านโดยพูดว่า "โอ้มันไม่ได้ช่วยให้อ่านง่ายขนาดนั้นใครจะสนใจ?"

สมมติว่าคุณต้องตรวจสอบก่อนที่รหัสหลัก:

if precondition_fails(message): continue

''' main code here '''

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

ลองนึกภาพถ้าคุณต้องทำ breakfix ของรหัสการผลิตซึ่งจะเป็นการเพิ่มบรรทัดด้วยการดำเนินการต่อ ง่ายที่จะเห็นว่าเป็นเพียงการเปลี่ยนแปลงเมื่อคุณตรวจสอบรหัส หากคุณเริ่มตัดโค้ดหลักใน if / else diff จะไฮไลต์โค้ดที่เยื้องใหม่เว้นแต่คุณจะไม่สนใจการเปลี่ยนแปลงระยะห่างซึ่งเป็นอันตรายโดยเฉพาะใน Python ฉันคิดว่าถ้าคุณไม่ได้อยู่ในสถานการณ์ที่คุณต้องใช้รหัสในการแจ้งให้ทราบสั้น ๆ คุณอาจไม่พอใจอย่างเต็มที่


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

4
แต่continueคำสั่งเพิ่มที่นี่อะไร มันสามารถกำจัดได้โดยใช้element not in colorsและรหัสจะสามารถอ่านได้
ekhumoro

4

สมมติว่าเราต้องการพิมพ์ตัวเลขทั้งหมดที่ไม่ใช่ทวีคูณของ 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
Wildcard

วิธีที่ถูกต้องคือการใช้งานต่อหรือไม่ใช้ตัวดำเนินการ เหตุใดจึงต้องใช้บัตรผ่าน
ytpillai

ฉันชอบวิธีของคุณดีกว่า (ดังนั้น upvote) ฉันมาถึงหน้านี้พยายามที่จะสังคายนาถ้ามีเคยจำเป็นcontinueกับการใช้งาน ข้อสรุปของฉันคือการที่ไม่เคยมีความจำเป็นแต่ในบางกรณี (เช่นนี้) continueรหัสสามารถอ่านได้มากขึ้นโดยใช้ มันเป็นตัวอย่างที่ดีมาก
สัญลักษณ์แทน

3

ไม่จำเป็นอย่างยิ่งเนื่องจากสามารถใช้กับ IF ได้ แต่สามารถอ่านได้มากขึ้นและมีราคาไม่แพงในระยะเวลาใช้งาน

ฉันใช้เพื่อข้ามการวนซ้ำในลูปถ้าข้อมูลไม่ตรงตามข้อกำหนดบางประการ:

# 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บล็อก
bryc

เหตุใดจึงเป็นแบบ24 ชั่วโมงแต่มี 60 นาที
Patrick Artner

ไม่มีเหตุผลใดที่จะยกตัวอย่างแก้ไขได้ฟรี
Bastian

1

ตัวอย่างเช่นหากคุณต้องการทำสิ่งที่แตกต่างกันขึ้นอยู่กับค่าของตัวแปร:

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 เท่านั้นและไปที่รายการถัดไปของลูป


3
ตัวอย่างของคุณจะไม่พิมพ์อะไรเลยเนื่องจากเงื่อนไขแรกเป็นจริงเสมอ สมมติว่าค่าเริ่มต้นสำหรับการmy_var 0
Dan D.

ฉันแค่ดัดแปลงตัวอย่างโค้ดเก่าของฉัน ค่าดั้งเดิมของ var ไม่ใช่ 0 และมีการเพิ่มส่วนเพิ่มเพื่อความสะดวกเนื่องจากไม่มีตำแหน่งเดิม เนื่องจากมันเป็นตัวอย่างและคุณค่าของมันไม่สำคัญเลยฉันคิดว่ามันโอเค
jonathan.hepp

9
ไม่เป็นไร continueมันไม่ได้เป็นโฆษณาที่ดีสำหรับการใช้
John Machin

3
และสิ่งแรกที่elifควรจะเป็นifคือ รหัสไม่ได้ให้ลักษณะที่คุณรู้ว่าคุณกำลังทำอะไรอยู่
John Machin

นี่เป็นตัวอย่างที่ไม่ดี
แพทริค

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