Perlクックブックのお題をPythonで解いてみた その16
レシピ2.6 乱数を生成する
#!/usr/bin/env python # -*- coding: utf-8 -*- import random # 25 <= n <= 75 の乱数を1つ生成する print random.randrange(25,75+1) print random.randint(25,75) # a から z までの文字から10個を無作為に抽出する str = "abcdefghijklmnopqrstuvwxyz" listStr = [ str[random.randrange(0,len(str))] for n in range(10)] print ''.join(listStr)
#!/usr/bin/env python # -*- coding: utf-8 -*- from random import Random # 25 <= n <= 75 の乱数を1つ生成する rand = Random() print rand.randrange(25,75+1) print rand.randint(25,75) # a から z までの文字から10個を無作為に抽出する str = "abcdefghijklmnopqrstuvwxyz" listStr = [ str[rand.randrange(0,len(str))] for n in range(10)] print ''.join(listStr)
さて、上の2つ、結果として同じ処理を行っている訳ですが、
ソースコードが、微妙に違います。
違う部分というのは、モジュールのインポート部分。
上の方のインポート部分が、
import random
なのに対して、下のものは
from random import Random
となってします。
これは、どちらもrandomモジュール内のRandomクラスをインポートしています。
randomモジュールには、Randomクラスの他にWichmannHillクラスと
SystemRandomクラスが定義されています。
下のソースは、この中のRandomクラスをインポートすることを、
プログラマが明示的に書いている形になります。
では、上のソースは、どのような仕組みになっているのかというと、
randomモジュールの最後の方で、実はRandomクラスを用いてインスタンスを
生成しているのです。
random.py Line 828
_inst = Random() seed = _inst.seed random = _inst.random uniform = _inst.uniform randint = _inst.randint choice = _inst.choice randrange = _inst.randrange sample = _inst.sample shuffle = _inst.shuffle normalvariate = _inst.normalvariate lognormvariate = _inst.lognormvariate expovariate = _inst.expovariate vonmisesvariate = _inst.vonmisesvariate gammavariate = _inst.gammavariate gauss = _inst.gauss betavariate = _inst.betavariate paretovariate = _inst.paretovariate weibullvariate = _inst.weibullvariate getstate = _inst.getstate setstate = _inst.setstate jumpahead = _inst.jumpahead getrandbits = _inst.getrandbits
この部分があるので、プログラマは、Randomクラスを明示的にインポートして
インスタンスを作ることなく、メソッドをしようすることが可能なのです。
(偉そうに書いているけど、これ、リファレンスにも書いてあるという事実)