ฉันสังเกตว่ารหัสต่อไปนี้ถูกกฎหมายใน Python คำถามของฉันคือทำไม มีเหตุผลที่เฉพาะเจาะจงหรือไม่?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
after:
พวกเขาควรจะเปลี่ยนชื่อ
ฉันสังเกตว่ารหัสต่อไปนี้ถูกกฎหมายใน Python คำถามของฉันคือทำไม มีเหตุผลที่เฉพาะเจาะจงหรือไม่?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
after:
พวกเขาควรจะเปลี่ยนชื่อ
คำตอบ:
else
ข้อจะถูกดำเนินการเฉพาะเมื่อคุณwhile
สภาพกลายเป็นเท็จ หากคุณbreak
ออกจากลูปหรือหากมีการยกข้อยกเว้นมันจะไม่ถูกดำเนินการ
วิธีหนึ่งที่จะคิดเกี่ยวกับมันคือถ้า / อื่นสร้างด้วยความเคารพต่อเงื่อนไข:
if condition:
handle_true()
else:
handle_false()
คล้ายกับโครงสร้างลูป:
while condition:
handle_true()
else:
# condition is false now, handle and go on with the rest of the program
handle_false()
ตัวอย่างอาจอยู่ในแนวของ:
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
ยกเว้นว่าsomething
จะถูกข้ามไปหากคุณbreak
อยู่ในwhile
วง
ส่วนelse
คำสั่งจะถูกดำเนินการถ้าคุณออกจากบล็อกตามปกติโดยการกดปุ่มเงื่อนไขห่วงหรือล้มลงด้านล่างของลองบล็อก มันจะไม่ถูกดำเนินการถ้าคุณbreak
หรือreturn
ออกจากบล็อกหรือยกข้อยกเว้น มันทำงานได้ไม่เพียง แต่ในขณะที่และสำหรับลูป แต่ยังลองบล็อก
โดยปกติแล้วคุณจะพบมันในสถานที่ที่โดยปกติคุณจะออกจากลูปเร็วและการวิ่งออกจากลูปนั้นเป็นโอกาสที่ไม่คาดคิด / ผิดปกติ ตัวอย่างเช่นหากคุณวนลูปผ่านรายการที่กำลังมองหาค่า:
for value in values:
if value == 5:
print "Found it!"
break
else:
print "Nowhere to be found. :-("
found_it=False
ที่จุดเริ่มต้นของวงแล้วทำถ้าตรวจสอบในfound_it
ตอนท้าย
ในการตอบกลับIs there a specific reason?
นี่คือแอปพลิเคชั่นหนึ่งที่น่าสนใจ: แบ่งออกเป็นหลายระดับ
นี่คือวิธีการทำงาน: ลูปด้านนอกมีตัวแบ่งในตอนท้ายดังนั้นมันจะถูกดำเนินการเพียงครั้งเดียว อย่างไรก็ตามหากลูปด้านในเสร็จสมบูรณ์ (ไม่พบตัวหาร) จะถึงคำสั่ง else และจะไม่ถึงตัวแบ่งด้านนอก ด้วยวิธีนี้การแตกในวงด้านในจะแยกออกจากลูปทั้งสองมากกว่าหนึ่ง
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!'
สำหรับทั้งสองwhile
และfor
ลูปelse
คำสั่งจะถูกดำเนินการในตอนท้ายเว้นแต่จะbreak
ใช้
ในกรณีส่วนใหญ่มีวิธีที่ดีกว่าในการทำเช่นนี้ (ห่อไว้ในฟังก์ชันหรือเพิ่มข้อยกเว้น) แต่ใช้งานได้!
ประโยคอื่นถูกดำเนินการเมื่อ while-condition ประเมินเป็นเท็จ
จากเอกสาร :
คำสั่ง while ใช้สำหรับการประมวลผลซ้ำตราบใดที่นิพจน์เป็นจริง:
while_stmt ::= "while" expression ":" suite ["else" ":" suite]
นี่เป็นการทดสอบนิพจน์ซ้ำ ๆ และถ้าเป็นจริงให้ดำเนินการชุดแรก หากการแสดงออกเป็นเท็จ (ซึ่งอาจเป็นครั้งแรกที่มีการทดสอบ) ชุดของ
else
ข้อถ้ามีอยู่จะถูกดำเนินการและวงสิ้นสุด
break
งบดำเนินการในชุดแรกยุติวงโดยไม่ต้องดำเนินการelse
ชุดของประโยคcontinue
งบดำเนินการในชุดแรกที่ข้ามส่วนที่เหลือของชุดและกลับไปทดสอบการแสดงออก
คำตอบของฉันจะเน้นที่เมื่อเราสามารถใช้ในขณะ / สำหรับอื่น
จากภาพรวมครั้งแรกดูเหมือนว่าจะไม่แตกต่างกันเมื่อใช้งาน
while CONDITION:
EXPRESSIONS
print 'ELSE'
print 'The next statement'
และ
while CONDITION:
EXPRESSIONS
else:
print 'ELSE'
print 'The next statement'
เนื่องจากprint 'ELSE'
คำสั่งดูเหมือนว่าจะดำเนินการเสมอในทั้งสองกรณี (ทั้งเมื่อwhile
ลูปเสร็จหรือไม่ทำงาน)
จากนั้นจะแตกต่างกันเมื่อคำสั่งprint 'ELSE'
จะไม่ถูกดำเนินการ มันคือเมื่อมีbreak
การบล็อคโค้ดอยู่ข้างใต้while
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
หากแตกต่างจาก:
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
ไม่ได้อยู่ในหมวดหมู่นี้เนื่องจากจะมีผลเหมือนกันสำหรับสองกรณีข้างต้น
การยกข้อยกเว้นยังไม่ก่อให้เกิดความแตกต่างเพราะเมื่อยกรหัสที่ถัดไปจะถูกดำเนินการอยู่ในตัวจัดการข้อยกเว้น (ยกเว้นบล็อก) รหัสในelse
ข้อหรือขวาหลังจากwhile
ข้อจะไม่ถูกดำเนินการ
ฉันรู้ว่านี่เป็นคำถามเก่า แต่ ...
ขณะที่เรย์มอนด์ Hettinger กล่าวว่ามันควรจะเรียกว่าแทนwhile/no_break
ฉันคิดว่ามันง่ายที่จะขีดเส้นใต้ถ้าคุณดูตัวอย่างนี้while/else
n = 5
while n > 0:
print n
n -= 1
if n == 2:
break
if n == 0:
print n
ตอนนี้แทนที่จะตรวจสอบเงื่อนไขหลังจากในขณะที่วนรอบเราสามารถสลับกับelse
และกำจัดเช็คนั้น
n = 5
while n > 0:
print n
n -= 1
if n == 2:
break
else: # read it as "no_break"
print n
ฉันมักจะอ่านมันwhile/no_break
เพื่อทำความเข้าใจกับรหัสและไวยากรณ์นั้นเหมาะสมสำหรับฉันมากขึ้น
ส่วนคำสั่งอื่นจะดำเนินการเฉพาะเมื่อในขณะที่เงื่อนไขกลายเป็นเท็จ
นี่คือตัวอย่างบางส่วน:
ตัวอย่างที่ 1:ในขั้นต้นเงื่อนไขเป็นเท็จดังนั้นคำสั่งอื่นจะถูกดำเนินการ
i = 99999999
while i < 5:
print(i)
i += 1
else:
print('this')
เอาท์พุท:
this
ตัวอย่างที่ 2: ในขณะที่สภาพ i < 5
ไม่เคยเป็นเท็จเพราะi == 3
แบ่งห่วงดังนั้นข้ออื่นไม่ได้ดำเนินการ
i = 0
while i < 5:
print(i)
if i == 3:
break
i += 1
else:
print('this')
เอาท์พุท:
0
1
2
3
ตัวอย่างที่ 3: ในขณะที่สภาพ i < 5
กลายเป็นเท็จเมื่อi
เป็น5
ดังนั้นอื่นข้อถูกประหารชีวิต
i = 0
while i < 5:
print(i)
i += 1
else:
print('this')
เอาท์พุท:
0
1
2
3
4
this
else:
คำสั่งจะถูกดำเนินการเมื่อใดและเฉพาะเมื่อในขณะที่วงไม่ตรงกับสภาพของ (ในตัวอย่างของคุณเมื่อn != 0
เป็นเท็จ)
ดังนั้นผลลัพธ์จะเป็น:
5
4
3
2
1
what the...
ดำเนินการอื่นถ้าในขณะที่วงไม่แตก
ฉันชอบคิดด้วยคำเปรียบเทียบ 'นักวิ่ง'
"อื่น ๆ " เป็นเหมือนการข้ามเส้นชัยไม่เกี่ยวข้องกับว่าคุณเริ่มต้นที่จุดเริ่มต้นหรือจุดสิ้นสุดของแทร็ก "else" จะไม่ถูกเรียกใช้งานถ้าคุณแยกจากที่ไหน
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.
กรณีการใช้งานหลักคือการใช้การแบ่งลูปซ้อนกันหรือหากคุณต้องการเรียกใช้คำสั่งเฉพาะในกรณีที่การวนซ้ำไม่ได้อยู่ที่ใดที่หนึ่ง
ตัวอย่างเช่นต่อไปนี้เป็นกลไกในการแยกวงภายในโดยไม่ต้องใช้ตัวแปรหรือลอง / จับ:
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
การใช้งาน 'while: else:' ที่ดีขึ้นใน Python ควรจะเป็นถ้าไม่มีการวนซ้ำใน 'ในขณะที่' ดังนั้นคำสั่ง 'else' จะถูกดำเนินการ วิธีการทำงานในวันนี้ไม่สมเหตุสมผลเนื่องจากคุณสามารถใช้รหัสด้านล่างด้วยผลลัพธ์เดียวกัน ...
n = 5
while n != 0:
print n
n -= 1
print "what the..."
else
บล็อกจะไม่ถูกดำเนินการหากคุณออกจากลูปโดยใช้คำหลักbreak
หรือ return
ในตัวอย่างของคุณprint
จะถูกประหารชีวิตด้วยหากbreak
คำสั่งวนซ้ำสิ้นสุดลง
มันมีประโยชน์สำหรับการโต้ตอบทางสังคม
while (Date != "January 1st"):
time.sleep(1)
else:
print("Happy new year!")
else
นี่คืออะไร? รหัสทำสิ่งเดียวกันโดยไม่ต้องมีรหัส
break
ของคุณในระหว่างการนับถอยหลังการไม่ใช้else
จะทำให้คุณพูดว่า "สวัสดีปีใหม่!" ทันทีซึ่งไม่สมเหตุสมผลใด ๆ
break
" ไม่มีbreak
ในรหัส
else
สำหรับการใช้งานนี้เป็นความคิดที่ไม่ดีอย่างน่าทึ่งและพวกเขาจะไม่ทำสิ่งเหล่านี้อีก