Python – ループ文のelse節
2009年4月19日 9:23 PM by Abalone




Pythonを勉強中、ループ文で、面白いと思えたものがあるのでちょっと書いてみたい。

ループ処理にelse節が付けられる、というものである。

ループ文にelse節ってのは、最初私には大分奇異に映ったが、これは便利に使える場面がありそうだ。

基本的な書き方は以下の通り。

while 条件文:
    ループ処理本体
else:
    ループ後処理

for 文だと、

for 条件文:
    ループ処理本体
else:
    ループ後処理

for文でも書き方はwhile文と同じで、ループ後にelse節を付けるだけである
まあelse節を付けるだけなので、文法的に難しいものではない。このelse節が実行されるのは、
ループ本体の条件文がFalseになってループを抜けた時だけ。ループからbreakとかで抜けた時には実行されない。

これがあると、ループをbreakで抜けたのか、それともループ条件を満たさなくなってループを抜けたのか判定するためのコードを書く必要がなくなる。例えば、ある配列の中に目的の値が格納されているかどうかを検索するためのコードをCで書くと以下のような感じになるだろう。

int     i;
int     flag;
int     ary[16];

for ( i=0, flag=0; i<16; ++i ) {
    if (ary[i]==0) {
       flag = 1 ;
       printf("Found !!");
       break ;
    }
}
if (flag==0) {
   printf("Not found !!");
}

これがPythonでfor文を使うと次のように書ける。

for target in ary:
   if target==0:
      print "Found !!"
      break
else:
    print "Not found !!"

Pythonのこの書き方だと、配列中を探索していた値が見つかったのかどうかを後から調べるためにflag変数を導入する必要がない。
大差ないと思えるかもしれないが、C言語版の方は、後から読み返したときにflag変数を何のために1にしているのかを考えなくてはならない。一方Python版の方は、ループが終了して抜けた時の処理がelse節に書かれている、というのが一目で分かる。これはうまく使うと読みやすいコードが書けそうだ。

あ、そうだ、上のCのコードはエイっと書き下したやつなので、実際に実行はしていない。たぶん大丈夫だと思うけど、実行できなかったらスンマセン。





トラックバックURL


この記事に対するコメント/トラックバック(3件)
  • ループを回さなくても単に

    if target in ary: print “Found !!”
    else: print “Not found !!”

    とするだけで桶。

    by 上記の例なら 2009-04-20 10:08:13


  • なるほど、私が書いた例の場合には、もっと簡単に書けるのですね。
    頑張って勉強します。

    コメントありがとうございました。

    by Abalone 2009-04-22 0:27:21


  • [...] 素が順次代入されてくる。全部の要素に対する実行が終わると、else節が実行される。else節はあってもなくても構わない。このelse節については以前にも書いた。では、実際にやってみる。 [...]




  • コメントをどうぞ

    お名前(必須)
    Eメールアドレス(公開されません)(必須)