2010-07-21 29 views
6

Mã python sau sẽ cho kết quả là n (14) được in, vì vòng lặp for được hoàn tất.Đối diện với Python cho ... else

for n in range(15): 
    if n == 100: 
     break 
else: 
    print(n) 

Tuy nhiên, điều tôi muốn trái ngược với điều này. Có cách nào để làm một cho ... khác (hoặc trong khi ... khác) vòng lặp, nhưng chỉ thực thi mã khác nếu vòng lặp đã làm phá vỡ?

+0

Quá mệt mỏi để viết một atm giải pháp nhưng sử dụng contextmanagers có thể là một solut (có thể sau!) ion! Nguồn cảm hứng có thể ở đây: http://stackoverflow.com/a/3171971/1524913 – JeromeJ

Trả lời

16

Không có rõ ràng for...elseifbreak -like xây dựng bằng Python (hoặc trong bất kỳ ngôn ngữ mà tôi biết), vì bạn chỉ có thể làm điều này:

for n in range(15): 
    if n == 100: 
     print(n) 
     break 

Nếu bạn có nhiều break s, đặt print(n) trong một chức năng vì vậy bạn Don't Repeat Yourself.

+0

Chắc chắn không phải những gì op muốn? –

+4

tại sao không? nó có tác dụng tương tự. Nếu bạn muốn mã chạy khi bạn gặp câu lệnh 'break', thì chỉ cần ... chạy mã trước câu lệnh ngắt –

+0

Tôi chưa thấy các cấu trúc giống như vậy, nhưng bạn luôn có thể sử dụng \ * shudders \ *' goto' – NullUserException

6

Một chút giải pháp chung chung hơn sử dụng ngoại lệ trong trường hợp bạn phá vỡ ở nhiều điểm trong vòng lặp và không muốn lặp lại mã:

try: 
    for n in range(15): 
     if n == 10: 
      n = 1200 
      raise StopIteration() 
     if n > 4: 
      n = 1400 
      raise StopIteration() 
except StopIteration: 
    print n 
4

tôi không thực sự thích câu trả lời đăng cho đến nay, như tất cả chúng đều yêu cầu cơ thể của vòng lặp được thay đổi, có thể gây phiền nhiễu/nguy hiểm nếu cơ thể thực sự phức tạp, vì vậy đây là một cách để làm điều đó bằng cách sử dụng một lá cờ. thay thế _break với found hay cái gì khác có ý nghĩa đối với trường hợp sử dụng của bạn

_break = True 
for n in range(15): 
    if n == 100: 
     break 
else: 
    _break = False 

if _break: 
    print(n) 

Một khả năng nếu nó là một chức năng mà không làm gì nếu vòng lặp không tìm thấy một trận đấu, là return trong khối else:

for n in range(15): 
    if n == 100: 
     break 
else: 
    return 
print(n) 
0

thế nào về:

for n in range(15): 
    if n == 100: 
     break 
else: 
    print("loop successful") 
if n != range(15)[-1]: 
    print("loop failed") 
+0

Điều này cho kết quả sai nếu 'ngắt' xảy ra trong vòng lặp cuối cùng. Nó sẽ in _both_ "loop thành công" và "loop thất bại" trong trường hợp đó. –

Các vấn đề liên quan