2012-07-20 12 views
10

私はPythonの初心者です。私は、 "for - else"と "while-else"の "else"は完全に不要であることがわかります。 "for"と "while"は最終的に "else"に実行されるので、代わりに通常の行を使うことができます。例えばなぜ "for-else"と "while-else"に "else"があるのですか?

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

そして

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

は同じです。

なぜ、 "for-else"と "while-else"に "else"があるのですか?

答えて

21

for/elseのセマンティクスについて間違っています。 else節は、break文が見つからなかった場合など、ループが完了した場合にのみ実行されます。

/他のループの典型的には、次のようになります。「他」の

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

だと思う「場合の」ループ本体内のすべてとのペアリングとして。あなたのサンプルは同じですが、ミックスに「ブレーク」ステートメントが付いていても、そうではありません。

同じ考えの長い説明:http://nedbatchelder.com/blog/201110/forelse.html

+0

...または例外がスローされました –

+0

ああ!私はそれを知っています。 – Jimmy

1

for ... else文は、検索ループを実装するために使用されます。

特に、検索ループが何かを見つけられない場合を処理します。

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 

出力:

we found 5 
z = 5 

検索は、検索リスト(すなわち[])空の場合forがZ初期化されないことに注意してください

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 

と同じです。そのため、検索後にzを使用するときにzを定義する必要があります。 zが印刷しようとしたときに定義されていないため、次は例外を発生させます。要約する

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

print "z = ",z 

出力

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

forループが自然に終了するたびに、else句が実行されます。 forループでブレークまたは例外が発生すると、elseステートメントは実行されません。

関連する問題