Gần đây tôi đã tình cờ gặp một sự mâu thuẫn dường như trong cách xử lý của Python với các mệnh đề khác trong các câu lệnh ghép khác nhau. Kể từ khi Python được thiết kế rất tốt, tôi chắc chắn rằng có một lời giải thích tốt, nhưng tôi không thể nghĩ về nó.Tại sao người khác lại hành xử khác trong các câu lệnh trong/khi trái ngược với câu lệnh if/try?
xem xét như sau:
if condition:
do_something()
else:
do_something_else()
Ở đây, do_something_else()
chỉ thực hiện nếu condition
là sai, như mong đợi.
Tương tự, trong
try:
do_something()
except someException:
pass:
else:
do_something_else()
finally:
cleanup()
do_something_else()
chỉ được thực hiện nếu không có ngoại lệ xảy ra.
Nhưng trong hoặc trong khi vòng lặp, một mệnh đề khác luôn được thực hiện, cho dù nội dung của for/while block
đã được thực thi hay chưa.
for i in some_iterator:
print(i)
else:
print("Iterator is empty!")
sẽ luôn in "Iterator trống!", Cho dù tôi nói some_iterator = []
hoặc some_iterator = [1,2,3]
. Hành vi tương tự trong các mệnh đề while-else
. Dường như với tôi rằng else
hoạt động giống như finally
trong những trường hợp này. Tôi đang nhìn gì?
Tôi ngạc nhiên khi Python cho phép cú pháp. Trong hầu hết các ngôn ngữ khác -else bị hạn chế chỉ được sử dụng với if- hoặc switch-statement. Các vòng lặp và các câu lệnh thử có thể kiểm soát luồng, nhưng chúng không có điều kiện giống như một câu lệnh if, do đó, -else không có chỗ trong chúng. – shuckster
Đối với những gì nó có giá trị, đã có một cuộc thảo luận gần đây dài của for/else, et al, trên danh sách python-ideas, tóm tắt ở đây: http://article.gmane.org/gmane.comp.python.ideas/6131 /. Bản thân Guido thừa nhận có suy nghĩ thứ hai về nó: http://article.gmane.org/gmane.comp.python.ideas/6133/ –
Cảm ơn các liên kết này! –