2012-07-05 11 views
8

Tôi cố gắng để lặp qua một danh sách, và tôi cần phải thực hiện thao tác cụ thể khi và chỉ khi lặp đi lặp lại đến cuối danh sách, xem ví dụ dưới đây:Duyệt qua danh sách và xử lý StopIteration bằng Python đẹp

data = [1, 2, 3] 

data_iter = data.__iter__() 
try: 
    while True: 
     item = data_iter.next() 
     try: 
      do_stuff(item) 
      break # we just need to do stuff with the first successful item 
     except: 
      handle_errors(item) # in case of no success, handle and skip to next item 
except StopIteration: 
    raise Exception("All items weren't successful") 

Tôi tin rằng mã này không phải là quá Pythonic, vì vậy tôi đang tìm kiếm một cách tốt hơn. Tôi nghĩ rằng mã lý tưởng sẽ trông giống như đoạn giả định dưới đây:

data = [1, 2, 3] 

for item in data: 
    try: 
     do_stuff(item) 
     break # we just need to do stuff with the first successful item 
    except: 
     handle_errors(item) # in case of no success, handle and skip to next item 
finally: 
    raise Exception("All items weren't successful") 

Bất kỳ suy nghĩ nào đều được hoan nghênh.

+0

thay 'cuối cùng' bằng' else'? – WolframH

+0

Tại sao bạn có ''Tất cả các mục không thành công'' thay vì' "Tất cả các mục không thành công" '? Dấu nháy đơn giữa đó sẽ phá vỡ chuỗi/ngoại lệ của bạn nếu nó chạy. Ngoài ra, đến điểm của WolframH, xem [docs] (http://docs.python.org/reference/compound_stmts.html#for) - 'else' thay vì' finally' sẽ hoạt động. – thegrinner

+1

Điều đáng chú ý là 'ngoại trừ:' là một điều khủng khiếp - nếu nó chỉ là ví dụ, tốt, nhưng trong bất kỳ ví dụ thực sự nào, xin vui lòng chỉ bắt một ngoại lệ cụ thể. –

Trả lời

16

Bạn có thể sử dụng else sau một vòng lặp for, và các mã trong else mà chỉ thực hiện nếu bạn không break ra khỏi vòng lặp for:

data = [1, 2, 3] 

for item in data: 
    try: 
     do_stuff(item) 
     break # we just need to do stuff with the first successful item 
    except Exception: 
     handle_errors(item) # in case of no success, handle and skip to next item 
else: 
    raise Exception("All items weren't successful") 

Bạn có thể tìm thấy điều này trong documentation for the for statement, mảnh liên quan hiển thị dưới đây:

for_stmt ::= "for" target_list "in" expression_list ":" suite 
       ["else" ":" suite] 

Một tuyên bố break thực hiện trong bộ phần mềm đầu tiên kết thúc vòng lặp mà không thực hiện cácSuite của khoản 210.

+1

Khi tôi đang gõ nó lên. +1 - đây là cách tốt nhất để làm điều đó. –

+0

Có, nó đã được rõ ràng, cảm ơn! –