wiki:PythonIntroFor

Version 2 (modified by sgk, 13 years ago) (diff)

--

Python:for(;;)が無い

Python情報 >> Pythonを学ぶ人に

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ではforforeachも同じ意味で、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を使ってジェネレータを作るというテはありますが、ここでは省略します。