Ví dụ về việc sử dụng câu lệnh tiếp tục trên mạng trong Python?


177

Các định nghĩa của continuetuyên bố là:

Câu continuelệnh tiếp tục với lần lặp tiếp theo của vòng lặp.

Tôi không thể tìm thấy bất kỳ ví dụ tốt về mã.

Ai đó có thể đề nghị một số trường hợp đơn giản khi continuecần thiết?

Câu trả lời:


218

Đây là một ví dụ đơn giản:

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

Đầu ra sẽ là:

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

Nó tiếp tục đến lần lặp tiếp theo của vòng lặp.


1
Tôi đã suy nghĩ trong ba hoặc bốn ngày qua, tại sao tôi lại cần một tuyên bố 'tiếp tục' và sau đó tôi chạy vào bài đăng này để lần lượt giúp tôi với một số QA - cảm ơn rất nhiều!
Freddy

3
tương tự ở đây, khi chúng ta viết kịch bản python (cho công việc cron) và lặp lại các giá trị lớn và một số ngoại lệ xảy ra thì công việc cron sẽ bị dừng và bạn chỉ có thể biết rằng ngày hôm sau, nó thực sự giúp ích rất nhiều trong trường hợp đó, Có chúng ta có thể viết tính năng gửi thư ngoại lệ nhưng việc thực thi sẽ bị dừng lại.
Snehal Parmar

2
Điều này minh họa những gì continuekhông nhưng nó không quá hữu ích, khi bạn có thể làmif letter != 'D': print 'Current Letter:', letter
Chris_Rands

Tôi đã chọn Cầu nguyện / xóa r hoặc Nhanh / xóa s.
Benjamin Crouzier

102

Tôi thích sử dụng tiếp tục trong các vòng lặp, nơi có rất nhiều bối cảnh phải được hoàn thành trước khi bạn "xuống kinh doanh". Vì vậy, thay vì mã như thế này:

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

Tôi nhận được mã như thế này:

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

Bằng cách này, tôi tránh được mã lồng rất sâu. Ngoài ra, thật dễ dàng để tối ưu hóa vòng lặp bằng cách loại bỏ các trường hợp xảy ra thường xuyên nhất trước tiên, do đó tôi chỉ phải xử lý các trường hợp không thường xuyên nhưng quan trọng (ví dụ: số chia là 0) khi không có showstopper khác.


2
Vì vậy, "tiếp tục" được sử dụng chủ yếu để dễ đọc bằng cách giảm thụt đầu dòng. Tôi tự hỏi nếu "tiếp tục" thêm bất kỳ sức mạnh biểu cảm.
JohnG

14
Sử dụng continuetrong thời trang này tương tự như sử dụng GOTO. Tuy nhiên, đây là đúng cách để sử dụng GOTO.
dotancohen

1
@ John Tôi không tin rằng có bất kỳ việc sử dụng tiếp tục (hoặc phá vỡ, đối với vấn đề đó) không thể được sao chép mà không có nó, mặc dù không có nó có thể tốn kém trong thời gian chạy.
Sparr

18

Thông thường, tình huống tiếp tục là cần thiết / hữu ích, là khi bạn muốn bỏ qua mã còn lại trong vòng lặp và tiếp tục lặp lại.

Tôi thực sự không tin rằng nó cần thiết, vì bạn luôn có thể sử dụng các câu lệnh if để cung cấp cùng logic, nhưng nó có thể hữu ích để tăng khả năng đọc mã.


23
lưu ý rằng việc sử dụng if <condition>: continuethay vì if not <condition>: ...tránh một mức độ thụt lề sẽ cần thiết nếu nó được viết mà không có nó.
Dan D.

1
Tôi đã định đăng một qn tương tự lên JohnG nhưng sau đó thấy rằng anh ta đã hỏi những gì tôi muốn biết. Đọc qua tất cả các câu trả lời ở đây đã giúp ích, nhưng tôi vẫn cần chắc chắn về một điều - vì vậy, bất cứ khi nào chúng tôi sử dụng một continuetuyên bố, về cơ bản chúng tôi sẽ nhảy ra khỏi phần kiểm tra có điều kiện và cho phép lặp lại vòng lặp để tiếp tục để lặp lại tiếp theo? Nó không rõ ràng với tôi làm thế nào điều này sẽ tốt hơn so với việc sử dụng else. Có phải tất cả chỉ là về khả năng đọc và hiệu suất thời gian chạy được cải thiện?
AKKO

"Tôi không tin là cần thiết" ... tốt, những người tạo ra trăn nghĩ khác.
Jean-François Fabre

12
import random  

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

tiếp tục là một tuyên bố kiểm soát cực kỳ quan trọng. Đoạn mã trên chỉ ra một ứng dụng điển hình, trong đó kết quả của phép chia bằng 0 có thể tránh được. Tôi sử dụng nó thường xuyên khi tôi cần lưu trữ đầu ra từ các chương trình, nhưng không muốn lưu trữ đầu ra nếu chương trình bị hỏng. Lưu ý, để kiểm tra ví dụ trên, thay thế câu lệnh cuối cùng bằng bản in 1 / float (x) hoặc bạn sẽ nhận được số không mỗi khi có một phân số, vì randint trả về một số nguyên. Tôi đã bỏ qua nó cho rõ ràng.


10

Một số người đã bình luận về khả năng đọc, nói rằng "Ồ nó không giúp đọc được nhiều, ai quan tâm chứ?"

Giả sử bạn cần kiểm tra trước mã chính:

if precondition_fails(message): continue

''' main code here '''

Lưu ý rằng bạn có thể làm điều này sau khi mã chính được viết mà không thay đổi mã đó bằng mọi cách. Nếu bạn khác mã, chỉ dòng được thêm bằng "tiếp tục" sẽ được tô sáng vì không có thay đổi khoảng cách cho mã chính.

Hãy tưởng tượng nếu bạn phải thực hiện một mã sản xuất, điều này hóa ra chỉ đơn giản là thêm một dòng với tiếp tục. Thật dễ dàng để thấy rằng đó là thay đổi duy nhất khi bạn xem lại mã. Nếu bạn bắt đầu gói mã chính trong if / other, diff sẽ làm nổi bật mã mới được thụt vào, trừ khi bạn bỏ qua các thay đổi về khoảng cách, đặc biệt nguy hiểm trong Python. Tôi nghĩ trừ khi bạn ở trong tình huống bạn phải đưa ra mã trong thông báo ngắn, bạn có thể không hoàn toàn đánh giá cao điều này.


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
Nhưng những gì continuetuyên bố thêm ở đây? Nó có thể được loại bỏ bằng cách sử dụng element not in colorsvà mã sẽ có thể đọc được.
ekhumoro

4

Giả sử chúng tôi muốn in tất cả các số không phải là bội của 3 và 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

Bạn cũng có thể chỉ cần sử dụng if x %3 == 0 or x % 5 == 0:, pass, else:,print x
Wildcard

Cách chính xác là sử dụng tiếp tục hoặc toán tử không. Tại sao không cần thiết sử dụng pass?
ytpillai

Tôi thích cách của bạn tốt hơn (do đó upvote). Tôi đến trang này để cố gắng sắp xếp nếu có nhu cầu sử dụng continue. Kết luận của tôi là không bao giờ có nhu cầu , nhưng trong một số trường hợp (như thế này), mã dễ đọc hơn bằng cách sử dụng continue. Đó là một ví dụ rất hay.
tự đại diện

3

Nó không thực sự cần thiết vì nó có thể được thực hiện với IF nhưng nó dễ đọc hơn và cũng ít tốn kém hơn trong thời gian chạy.

Tôi sử dụng nó để bỏ qua một vòng lặp trong một vòng lặp nếu dữ liệu không đáp ứng một số yêu cầu:

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

Đầu ra:

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

Như bạn có thể thấy, giá trị sai không xuất hiện sau continuecâu lệnh.


if chỉ có thể làm những gì continue nếu tất cả các mã được chứa trong một khối. continuebỏ qua mã mà thậm chí bên ngoài ifkhối.
bryc

Tại sao giờ 24 bao gồm nhưng phút là 60 độc quyền?
Patrick Artner

không có lý do cụ thể, chỉ là một ví dụ, vui lòng chỉnh sửa
Bastian

1

Ví dụ: nếu bạn muốn làm những việc khác nhau tùy thuộc vào giá trị của một biến:

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

Trong ví dụ trên nếu tôi sử dụng breaktrình thông dịch sẽ bỏ qua vòng lặp. Nhưng với continuenó chỉ bỏ qua các câu lệnh if-elif và đi thẳng đến mục tiếp theo của vòng lặp.


3
ví dụ của bạn sẽ không bao giờ in bất cứ điều gì, vì điều kiện đầu tiên luôn luôn đúng. giả định một giá trị ban đầu cho my_varcác 0.
Dan D.

Tôi chỉ đơn giản là điều chỉnh một ví dụ về một mã cũ của tôi. Giá trị ban đầu của var không phải là 0 và phần tăng thêm đã được thêm vào để thuận tiện vì vị trí ban đầu của nó không có ở đó. Vì nó là một ví dụ và giá trị của nó không thực sự quan trọng nên tôi đoán nó ổn.
jonathan.hepp

9
Nó không ổn. Nó không phải là một quảng cáo tốt để sử dụng continue.
John Machin

3
Và đầu tiên elifnên là một if. Mã không mang lại vẻ ngoài mà bạn biết bạn đang làm gì.
John Machin

đây là một ví dụ tồi tệ
patrick

0

continue chỉ cần bỏ qua phần còn lại của mã trong vòng lặp cho đến lần lặp tiếp theo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.