Tôi đã nhận thấy đoạn mã sau là hợp pháp trong Python. Câu hỏi của tôi là tại sao? Có một lý do cụ thể?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
after:
.
Tôi đã nhận thấy đoạn mã sau là hợp pháp trong Python. Câu hỏi của tôi là tại sao? Có một lý do cụ thể?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
after:
.
Câu trả lời:
Các else
khoản chỉ được thực hiện khi bạn while
điều kiện trở thành sai. Nếu bạn break
ra khỏi vòng lặp, hoặc nếu một ngoại lệ được nêu ra, nó sẽ không được thực thi.
Một cách để nghĩ về nó là một cấu trúc if / other liên quan đến điều kiện:
if condition:
handle_true()
else:
handle_false()
tương tự như cấu trúc lặp:
while condition:
handle_true()
else:
# condition is false now, handle and go on with the rest of the program
handle_false()
Một ví dụ có thể nằm dọc theo dòng:
while value < threshold:
if not process_acceptable_value(value):
# something went wrong, exit the loop; don't pass go, don't collect 200
break
value = update(value)
else:
# value >= threshold; pass go, collect 200
handle_threshold_reached()
while {} something
ngoại trừ việc nó something
sẽ bị bỏ qua nếu bạn break
trong while
vòng lặp.
Các else
khoản được thực hiện nếu bạn thoát khỏi một khối bình thường, bằng cách nhấn các điều kiện vòng lặp hoặc rơi xuống đáy của một khối try. Nó không được thực thi nếu bạn break
hoặc return
ra khỏi một khối, hoặc đưa ra một ngoại lệ. Nó hoạt động không chỉ trong khi và cho các vòng lặp, mà còn thử các khối.
Bạn thường tìm thấy nó ở những nơi mà thông thường bạn sẽ thoát khỏi một vòng lặp sớm và việc chạy hết vòng lặp là một dịp bất ngờ / bất thường. Ví dụ: nếu bạn đang lặp qua một danh sách đang tìm kiếm một giá trị:
for value in values:
if value == 5:
print "Found it!"
break
else:
print "Nowhere to be found. :-("
found_it=False
ở đầu vòng lặp, và sau đó thực hiện kiểm tra nếu found_it
kết thúc
Trả lời Is there a specific reason?
, đây là một ứng dụng thú vị: thoát ra khỏi nhiều cấp độ vòng lặp.
Đây là cách nó hoạt động: vòng lặp bên ngoài có một ngắt ở cuối, vì vậy nó sẽ chỉ được thực hiện một lần. Tuy nhiên, nếu vòng lặp bên trong hoàn thành (không tìm thấy ước số), thì nó sẽ đạt được câu lệnh khác và không thể đạt được sự phá vỡ bên ngoài. Bằng cách này, một sự phá vỡ trong vòng lặp bên trong sẽ thoát ra khỏi cả hai vòng, thay vì chỉ một vòng.
for k in [2, 3, 5, 7, 11, 13, 17, 25]:
for m in range(2, 10):
if k == m:
continue
print 'trying %s %% %s' % (k, m)
if k % m == 0:
print 'found a divisor: %d %% %d; breaking out of loop' % (k, m)
break
else:
continue
print 'breaking another level of loop'
break
else:
print 'no divisor could be found!'
Đối với cả hai while
và for
các vòng lặp, else
câu lệnh được thực thi ở cuối, trừ khi break
được sử dụng.
Trong hầu hết các trường hợp, có nhiều cách tốt hơn để làm điều này (gói nó thành một hàm hoặc đưa ra một ngoại lệ), nhưng cách này hiệu quả!
Mệnh đề other được thực thi khi điều kiện while ước lượng thành false.
Từ tài liệu :
Câu lệnh while được sử dụng để thực hiện lặp lại miễn là một biểu thức là đúng:
while_stmt ::= "while" expression ":" suite ["else" ":" suite]
Điều này liên tục kiểm tra biểu thức và, nếu nó là sự thật, thực thi bộ đầu tiên; nếu biểu thức là sai (có thể là lần đầu tiên nó được kiểm tra) thì bộ
else
mệnh đề, nếu có, được thực thi và vòng lặp kết thúc.Một
break
câu lệnh được thực thi trong bộ đầu tiên chấm dứt vòng lặp mà không thực hiện bộelse
mệnh đề. Mộtcontinue
câu lệnh được thực thi trong bộ đầu tiên bỏ qua phần còn lại của bộ và quay lại để kiểm tra biểu thức.
Câu trả lời của tôi sẽ tập trung vào KHI chúng ta có thể sử dụng while / for-other.
Thoạt nhìn, dường như không có gì khác biệt khi sử dụng
while CONDITION:
EXPRESSIONS
print 'ELSE'
print 'The next statement'
và
while CONDITION:
EXPRESSIONS
else:
print 'ELSE'
print 'The next statement'
Bởi vì print 'ELSE'
câu lệnh dường như luôn luôn được thực thi trong cả hai trường hợp (cả khi while
vòng lặp kết thúc hoặc không chạy).
Sau đó, nó chỉ khác khi câu lệnh print 'ELSE'
sẽ không được thực thi. Đó là khi có một break
khối bên trong khối mã bên dướiwhile
In [17]: i = 0
In [18]: while i < 5:
print i
if i == 2:
break
i = i +1
else:
print 'ELSE'
print 'The next statement'
....:
0
1
2
The next statement
Nếu khác với:
In [19]: i = 0
In [20]: while i < 5:
print i
if i == 2:
break
i = i +1
print 'ELSE'
print 'The next statement'
....:
0
1
2
ELSE
The next statement
return
không thuộc loại này, vì nó có tác dụng tương tự đối với hai trường hợp trên.
tăng ngoại lệ cũng không gây ra sự khác biệt, bởi vì khi nó tăng lên, nơi mã tiếp theo sẽ được thực thi là trong trình xử lý ngoại lệ (ngoại trừ khối), mã trong else
mệnh đề hoặc ngay sau while
mệnh đề sẽ không được thực thi.
Tôi biết đây là câu hỏi cũ nhưng ...
Như Raymond Hettinger đã nói, nó nên được gọi while/no_break
thay vì while/else
.
Tôi thấy thật dễ dàng để hiểu rằng nếu bạn nhìn vào đoạn trích này.
n = 5
while n > 0:
print n
n -= 1
if n == 2:
break
if n == 0:
print n
Bây giờ thay vì kiểm tra điều kiện sau vòng lặp while, chúng ta có thể trao đổi nó với else
và loại bỏ kiểm tra đó.
n = 5
while n > 0:
print n
n -= 1
if n == 2:
break
else: # read it as "no_break"
print n
Tôi luôn đọc nó while/no_break
để hiểu mã và cú pháp đó có ý nghĩa hơn đối với tôi.
Mệnh đề khác chỉ được thực hiện khi điều kiện while trở thành sai.
Dưới đây là một số ví dụ:
Ví dụ 1: Ban đầu điều kiện là sai, vì vậy mệnh đề khác được thực thi.
i = 99999999
while i < 5:
print(i)
i += 1
else:
print('this')
ĐẦU RA:
this
Ví dụ 2: Điều kiện while i < 5
không bao giờ trở thành sai vì i == 3
phá vỡ vòng lặp, vì vậy mệnh đề other không được thực thi.
i = 0
while i < 5:
print(i)
if i == 3:
break
i += 1
else:
print('this')
ĐẦU RA:
0
1
2
3
Ví dụ 3: Điều kiện while i < 5
trở thành sai khi i
có 5
, vì vậy mệnh đề khác được thực thi.
i = 0
while i < 5:
print(i)
i += 1
else:
print('this')
ĐẦU RA:
0
1
2
3
4
this
Câu else:
lệnh được thực thi khi và chỉ khi vòng lặp while không còn đáp ứng điều kiện của nó (trong ví dụ của bạn, khi n != 0
sai).
Vì vậy, đầu ra sẽ là thế này:
5
4
3
2
1
what the...
Khác được thực hiện nếu vòng lặp while không phá vỡ.
Tôi muốn nghĩ về nó với phép ẩn dụ của "người chạy bộ".
"Khác" giống như vượt qua vạch đích, không liên quan đến việc bạn bắt đầu ở đầu hay cuối đường đua. "Khác" chỉ không được thực thi nếu bạn ngắt ở đâu đó ở giữa.
runner_at = 0 # or 10 makes no difference, if unlucky_sector is not 0-10
unlucky_sector = 6
while runner_at < 10:
print("Runner at: ", runner_at)
if runner_at == unlucky_sector:
print("Runner fell and broke his foot. Will not reach finish.")
break
runner_at += 1
else:
print("Runner has finished the race!") # Not executed if runner broke his foot.
Các trường hợp sử dụng chính là sử dụng việc thoát ra khỏi các vòng lặp lồng nhau hoặc nếu bạn muốn chạy một số câu lệnh chỉ khi vòng lặp không bị hỏng ở đâu đó (hãy nghĩ rằng việc phá vỡ là một tình huống bất thường).
Ví dụ, sau đây là một cơ chế về cách thoát ra khỏi vòng lặp bên trong mà không cần sử dụng biến hoặc thử / bắt:
for i in [1,2,3]:
for j in ['a', 'unlucky', 'c']:
print(i, j)
if j == 'unlucky':
break
else:
continue # Only executed if inner loop didn't break.
break # This is only reached if inner loop 'breaked' out since continue didn't run.
print("Finished")
# 1 a
# 1 b
# Finished
Việc sử dụng tốt hơn 'while: other:' xây dựng trong Python sẽ là nếu không có vòng lặp nào được thực thi trong 'while' thì câu lệnh 'other' được thực thi. Cách thức hoạt động ngày hôm nay không có ý nghĩa gì vì bạn có thể sử dụng mã dưới đây với cùng kết quả ...
n = 5
while n != 0:
print n
n -= 1
print "what the..."
else
khối sẽ không được thực thi nếu bạn rời khỏi vòng lặp bằng cách sử dụng break
hoặc return
từ khóa. Trong ví dụ của bạn, print
cũng sẽ được thực hiện nếu vòng lặp kết thúc trên break
lệnh.
Nó rất hữu ích cho sự tương tác xã hội.
while (Date != "January 1st"):
time.sleep(1)
else:
print("Happy new year!")
else
đây là gì? Các mã làm chính xác như nhau mà không có nó.
break
của bạn trong thời gian đếm ngược, không sử dụng else
sẽ khiến bạn nói "Chúc mừng năm mới!" ngay lập tức mà không có ý nghĩa gì.
break
"? Không có break
trong mã.
else
này cho việc sử dụng này là một ý tưởng tồi tệ đáng kinh ngạc, và họ sẽ không làm gì thêm nữa.