Python:for(;;)が無い
C言語や、C言語に影響を受けた言語には、for文があります。初期設定、終了条件、更新処理を1行で指定してループをまわすことができますよね。
/* C言語 */ for (初期設定; 終了条件; 更新処理) { 処理; }
具体的な例を挙げると、こんな感じです。
/* C言語 */ for (int i = 0; i < 100; ++i) printf("%d\n", i); for (int j = 0; j < 100; j += 2) printf("%d\n", j);
これをPythonで書くと、こんな感じです。
# Python for i in range(100): print "%d\n" % i for j in range(0, 100, 2): print "%d\n" % j
おや?
Pythonにもfor文があるんじゃん?
はい。for文はあるんですが、初期設定、終了条件、更新処理を指定することができないんです。 Pythonのfor文は、リストなど(シーケンス)を指定されて、その値を1個ずつ取り出す処理を行います。 C言語のfor文というよりも、シェル(単なるshとか、bashとか)のfor文に近いですね。 あるいは、PHP言語のforeachとか。 そういえば、Perlではforもforeachも同じ意味で、C言語的な使い方にも、シーケンスの取り出しにも使えるんでしたね。
上記の例ではrange()を使いましたが、リストやタプルを指定することもできます。
# Python >>> for x in (1, 2, 3): ... print x ... 1 2 3 >>>
文字列を構成している文字を1個ずつ取り出すこともできます。
# Python >>> for c in 'abc': ... print c ... a b c >>>
それでは、C言語のテクニックだったような、単純な順序処理ではないfor文はどうやって書いたらいいんでしょうか。つまりこういうやつです。
/* C言語 */ char* s = "abcde"; for (p = &s[0]; *p; ++p) printf("%c\n", *p);
あるいはこんな、リストをたぐる処理(構造体の宣言は省略しています)。
/* C言語 */ char* list_head = ...; for (p = list_head; p; p = p->next) { なんかの処理; }
こういう、単純な順序処理ではない処理はfor文では書かないのがPythonのルールです。 あるいは、yieldを使ってジェネレータを作るというテはありますが、ここでは省略します。
