7

私は最近、さまざまな複合文の else 句を処理する Python の方法に一貫性がないように思われることに遭遇しました。Python は非常によく設計されているため、適切な説明があると確信していますが、思いつきません。

次の点を考慮してください。

if condition:
   do_something()
else:
   do_something_else()

ここでは、期待どおりに false のdo_something_else()場合にのみ実行されます。condition

同様に、

try:
   do_something()
except someException:
   pass:
else:
   do_something_else()
finally:
   cleanup()

do_something_else()例外が発生しなかった場合にのみ実行されます。

ただし、 for または while ループでは、内容が実行されたかどうかに関係なく、else 句が常に実行さfor/while blockれます。

for i in some_iterator:
   print(i)
else:
   print("Iterator is empty!")

私が言うsome_iterator = []some_iterator = [1,2,3]. while-else句で同じ動作。これらの場合のelseように振る舞うように私には思えます。finally私は何を見落としていますか?

4

3 に答える 3

13

ここで説明されているように、ループに対してステートメントが実行されなかった場合、構文は句をfor else実行します 。たとえば、このelse句は評価されません。elsebreak

for i in range(1,10):
    if i % 5 == 0:
       print i
       break
else:
    print "nothing divisible by 5"
于 2009-10-16T07:03:50.230 に答える
5

まぁ、見方次第ですね。あなたはこのようにelseを見ることができます(叫び声を許してください、それはコードで強調する唯一の方法です):

if condition:
   do_something()
IF THE PREVIOUS CONDITION WAS FALSE:
   do_something_else()

ここで、if/else と try/except/else の間に明らかな類似性があります。このような。

try:
   do_something()
IF THERE WAS AN EXCEPTION:
   pass:
IF THE PREVIOUS CONDITION WAS FALSE:
   do_something_else()
finally:
   cleanup()

else/for についても同様です:

IF some_iterator IS NOT EMPTY:
   i = next(some_iterator)
   print(i)
IF THE PREVIOUS CONDITION WAS FALSE:
   print("Iterator is empty!")

したがって、else は基本的な方法で 3 つのケースすべてでまったく同じように機能することがわかります。

しかし、次の方法で else を見ることもできます。

try:
   do_something()
except someException:
   pass:
IF NO EXCEPTION:
   do_something_else()
finally:
   cleanup()

そして、それはもはや同じではありませんが、一種の「他に何もない場合」のためです。for/else も同じ方法で見ることができます:

for i in some_iterator:
   print(i)
IF NO MORE ITERATING:
   print("Iterator is empty!")

しかし、繰り返しになりますが、elif を考慮すると、この方法で if/else でも機能します。

if condition:
   do_something()
elif otherconditaion:
   do_anotherthing()
IF NO CONDITION WAS TRUE:
   do_something_else()

Else をどのように見るかはあなた次第ですが、どちらの見方でも、else は 3 つのケースすべてに類似点があります。

于 2009-10-16T07:28:03.117 に答える
4

はい、Eli が述べたように、else 句はブレークしない場合にのみ実行されます。次のようなコードを実装できなくなります。

for i in range(1,10):
    if i % 5 == 0:
       print i
       break
if i % 5 != 0:
   print "nothing divisible by 5"

これはここではほぼ同じですが、終了の条件がもう少し複雑な場合 (さまざまな可能な条件または条件の組み合わせをチェックするなど) に便利です。

于 2009-10-16T07:10:47.167 に答える