Python bite: 繰り返し
Submitted by fujiwara on 2007, October 3 - 12:55pm.
Tagged: python
Python では、 いわゆる C/C++ 的な for ループが提供されていないため、 例えば 0 ~ N-1 の範囲でインクリメント変数を元にループを組みたい場合は、 以下のように記述します。
for i in range(N):
# i を元にした処理
C/C++ 的なループ(ベタ)
しかし、
range(N) は
N 個の要素を持つ配列をメモリ上に展開してしまうため、
N が一定以上の値をとり得る場合は咬まれます。
Python は range()
のイテレータ版ともいえる
xrange() を提供しており、
これはメモリ上に配列を展開しません。
for i in xrange(N):
# i を元にした処理
C/C++ 的なループ(イテレータ)
ループ変数の更新がもっと複雑な場合は、 ジェネレータを利用するのが妥当でしょう。
def countup(n):
current = 0
while current < n:
yield current
current += 1
for i in countup(N):
# i を元にした処理
C/C++ 的なループ(ジェネレータ)
もっとも、 ジェネレータの利用は、 内部実装的に見ればスタックコンテキストの一時退避を伴いますから、 使い方(寿命や深さ)を誤ると、 記述の簡潔さと引き換えに見えない資源消費のペナルティが課せられるので注意が必要です。
Login to post comments