Có một số cách để thoát ra khỏi một vài vòng lồng nhauGửi StopIteration để cho vòng lặp từ bên ngoài của iterator
Họ:
1) sử dụng break-tiếp tục
for x in xrange(10):
for y in xrange(10):
print x*y
if x*y > 50:
break
else:
continue # only executed if break was not used
break
2) để sử dụng trở lại
def foo():
for x in range(10):
for y in range(10):
print x*y
if x*y > 50:
return
foo()
3) để sử dụng ngoại lệ đặc biệt
class BreakIt(Exception): pass
try:
for x in range(10):
for y in range(10):
print x*y
if x*y > 50:
raise BreakIt
except BreakIt:
pass
Tôi đã nghĩ rằng có thể có một số cách khác để thực hiện điều đó. Đó là bằng cách sử dụng ngoại lệ StopIteration gửi trực tiếp đến vòng lặp bên ngoài. tôi đã viết mã này
it = iter(range(10))
for i in it:
for j in range(10):
if i*j == 20:
raise StopIteration
Thật không may, StopIteration đã không được đánh bắt bằng cách nào cho vòng lặp và mã sản xuất một Traceback xấu xí. Tôi nghĩ rằng đó là vì StopIteration không được gửi từ bên trong của vòng lặp nó. (đó là dự đoán của tôi, tôi không chắc chắn về nó).
Có cách nào để tôi có thể gửi StopIteration đến vòng ngoài không?
Cảm ơn!
Xin vui lòng, bạn có thể giải thích, làm thế nào soppable_iter hoạt động? Tôi không hiểu phần bắt đầu bằng nếu x: ... – ovgolovin
Điều đó thực sự thông minh và ngắn hơn nhiều so với phiên bản lớp mà tôi đã cung cấp! – kindall
Tôi nghĩ rằng tôi cần một cái nhìn gần hơn về coroutines, bởi vì với kiến thức hiện tại của tôi về nó tôi không thể nắm bắt những gì hiện các thuật toán trong stoppable_iter. – ovgolovin