2012-07-20 27 views
10

Tôi là người mới bắt đầu sử dụng Python. Tôi thấy rằng "khác" trong "for-else" và "while-else" là hoàn toàn không cần thiết. Bởi vì "for" và "while" cuối cùng sẽ chạy đến "else" và thay vào đó chúng ta có thể sử dụng các dòng thông thường.Tại sao Python có "else" trong "for-else" và "while-else"?

Ví dụ:

for i in range(1, 5): 
    print i 
else: 
    print 'over' 

for i in range(1, 5): 
    print i 
print 'over' 

đều giống nhau.

Vậy tại sao Python có "else" trong "for-else" và "while-else"?

Trả lời

21

Bạn sai về ngữ nghĩa của/else. Mệnh đề else chỉ chạy nếu vòng lặp hoàn thành, ví dụ, nếu một câu lệnh break không gặp phải.

Các điển hình cho/else vòng trông như thế này:

for x in seq: 
    if cond(x): 
     break 
else: 
    print "Didn't find an x I liked!" 

Hãy suy nghĩ về các "khác" như ghép nối với tất cả các "nếu" trong thân vòng lặp. Các mẫu của bạn giống nhau, nhưng với câu lệnh "break" trong hỗn hợp, chúng không có.

Một mô tả dài hơn của ý tưởng giống nhau: http://nedbatchelder.com/blog/201110/forelse.html

+0

... hoặc ngoại lệ được ném –

+0

Ồ! Tôi biết điều đó.Cảm ơn rất nhiều. – Jimmy

1

Tuyên bố for ... else được sử dụng để thực hiện vòng tìm kiếm.

Cụ thể, nó xử lý trường hợp vòng tìm kiếm không tìm thấy bất kỳ thứ gì.

for z in xrange(10): 
    if z == 5: 
     # We found what we are looking for 
     print "we found 5" 
     break # The else statement will not execute because of the break 
else: 

    # We failed to find what we were looking for 
    print "we failed to find 5" 
    z = None 

print 'z = ', z 

đầu ra:

we found 5 
z = 5 

Đó tìm kiếm cũng giống như

z = None 
for z in xrange(10): 
    if 5 == z: 
     # We found what we are looking for 
     break 

if z == None: 
    print "we failed to find 5" 
else: 
    print "we found 5" 

print 'z = ', z 

Hãy nhớ rằng for không khởi z nếu danh sách tìm kiếm là rỗng (ví dụ: []). Đó là lý do tại sao chúng tôi phải đảm bảo rằng z được xác định khi chúng tôi sử dụng nó sau khi tìm kiếm. Sau đây sẽ tăng ngoại lệ vì z không được xác định khi chúng tôi cố gắng in.

for z in []: 
    if 5 == z: 
     break 

print "z = ",z 

đầu ra

print "z = ",z 
NameError: name 'z' is not defined 

Tóm lại, mệnh đề else sẽ thực hiện bất cứ khi nào for vòng lặp kết thúc một cách tự nhiên. Nếu vi phạm hoặc ngoại lệ xảy ra trong vòng for, câu lệnh else sẽ không thực thi.

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