2013年11月11日月曜日

[Python] range関数を小数にも拡張する

forloopでしばしば使うrange関数。

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> range(10,0,-1)
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

このレンジ関数を小数に拡張したいときの書き方。
たとえば、0から1.0まで0.1刻みの値を返したいときは、以下のようにします。

0.普通に計算する

>>> for n in range(10):
...     print n*0.1
... 
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
普通ならばループの中で計算してしまえば良いですね。

1.リスト内包表記を使う

>>> [0.1*x for x in range(10)]
[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
というリスト内包表記を用いると、
>>> for n in [0.1*x for x in range(10)]:
...     print n
... 
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
同様の機能をシンプルに実装できます。

2.range関数を実数に拡張したジェネレータ関数を作る


def drange(begin, end, step):
    n = begin
    while n+step < end:
     yield n
     n += step
このようにdrange関数を定義すると、
>>> for n in drange(0.0,1.0,0.1):
...     print n
... 
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
このような結果を得ることが出来ます。

一番応用が利くのはリスト内包表記ですが、drange関数にはコード上で範囲やステップが分かりやすいという利点があります。

1 件のコメント:

Related Posts Plugin for WordPress, Blogger...