random 模块
"Anyone who considers arithmetical methods of producing random digits is, of course, in a state of sin."
- John von Neumann, 1951
random
模块包含许多随机数生成器.
基本随机数生成器(基于 Wichmann 和 Hill , 1982 的数学运算理论) 可以通过很多方法访问, 如 Example 2-29 所示.
2.17.0.1. Example 2-29. 使用 random 模块获得随机数字
File: random-example-1.py import random for i in range(5): # random float: 0.0 <= number < 1.0 print random.random(), # random float: 10 <= number < 20 print random.uniform(10, 20), # random integer: 100 <= number <= 1000 print random.randint(100, 1000), # random integer: even numbers in 100 <= number < 1000 print random.randrange(100, 1000, 2) 0.946842713956 19.5910069381 709 172 0.573613195398 16.2758417025 407 120 0.363241598013 16.8079747714 916 580 0.602115173978 18.386796935 531 774 0.526767588533 18.0783794596 223 344
注意这里的 randint
函数可以返回上界, 而其他函数总是返回小于上界的值. 所有函数都有可能返回下界值.
Example 2-30 展示了 choice
函数, 它用来从一个序列里分拣出一个随机项目. 它可以用于列表, 元组, 以及其他序列(当然, 非空的).
2.17.0.2. Example 2-30. 使用 random 模块从序列取出随机项
File: random-example-2.py import random # random choice from a list for i in range(5): print random.choice([1, 2, 3, 5, 9]) 2 3 1 9 1
在 2.0 及以后版本, shuffle
函数可以用于打乱一个列表的内容 (也就是生成一个该列表的随机全排列). Example 2-31 展示了如何在旧版本中实现该函数.
2.17.0.3. Example 2-31. 使用 random 模块打乱一副牌
File: random-example-4.py import random try: # available in 2.0 and later shuffle = random.shuffle except AttributeError: def shuffle(x): for i in xrange(len(x)-1, 0, -1): # pick an element in x[:i+1] with which to exchange x[i] j = int(random.random() * (i+1)) x[i], x[j] = x[j], x[i] cards = range(52) shuffle(cards) myhand = cards[:5] print myhand [4, 8, 40, 12, 30]
random
模块也包含了非恒定分布的随机生成器函数. Example 2-32 使用了 gauss (高斯)函数来生成满足高斯分的布随机数字.
2.17.0.4. Example 2-32. 使用 random 模块生成高斯分布随机数
File: random-example-3.py import random histogram = [0] * 20 # calculate histogram for gaussian # noise, using average=5, stddev=1 for i in range(1000): i = int(random.gauss(5, 1) * 2) histogram[i] = histogram[i] + 1 # print the histogram m = max(histogram) for v in histogram: print "*" * (v * 50 / m) **** ********** ************************* *********************************** ************************************************ ************************************************** ************************************* *************************** ************* *** *
timing 模块
14.20.0.1. Example 14-25. 使用 timing 模块
File: timing-example-1.py import timing import time def procedure(): time.sleep(1.234) timing.start() procedure() timing.finish() print "seconds:", timing.seconds() print "milliseconds:", timing.milli() print "microseconds:", timing.micro() seconds: 1 milliseconds: 1239 microseconds: 1239999
你可以按照 Example 14-26 中的方法用 time
模块实现 timing
模块的功能.
14.20.0.2. Example 14-26. 模拟 timing 模块
File: timing-example-2.py import time t0 = t1 = 0 def start(): global t0 t0 = time.time() def finish(): global t1 t1 = time.time() def seconds(): return int(t1 - t0) def milli(): return int((t1 - t0) * 1000) def micro(): return int((t1 - t0) * 1000000)
time.clock()
可以替换 time.time()
获得 CPU 时间.
pickle 模块
pickle
模块同 marshal
模块相同, 将数据连续化, 便于保存传输. 它比 marshal
要慢一些, 但它可以处理类实例, 共享的元素, 以及递归数据结构等.
4.6.0.1. Example 4-11. 使用 pickle 模块
File: pickle-example-1.py import pickle value = ( "this is a string", [1, 2, 3, 4], ("more tuples", 1.0, 2.3, 4.5), "this is yet another string" ) data = pickle.dumps(value) # intermediate format print type(data), len(data) print "-"*50 print data print "-"*50 print pickle.loads(data) <type 'string'> 121 -------------------------------------------------- (S'this is a string' p0 (lp1 I1 aI2 aI3 aI4 a(S'more tuples' p2 F1.0 F2.3 F4.5 tp3 S'this is yet another string' p4 tp5 . -------------------------------------------------- ('this is a string', [1, 2, 3, 4], ('more tuples', 1.0, 2.3, 4.5), 'this is yet another string')
不过另一方面, pickle
不能处理 code 对象(可以参阅 copy_reg
模块来完成这个).
默认情况下, pickle 使用急于文本的格式. 你也可以使用二进制格式, 这样数字和二进制 字符串就会以紧密的格式储存, 这样文件就会更小点. 如 Example 4-12所示.
4.6.0.2. Example 4-12. 使用 pickle 模块的二进制模式
File: pickle-example-2.py import pickle import math value = ( "this is a long string" * 100, [1.2345678, 2.3456789, 3.4567890] * 100 ) # text mode data = pickle.dumps(value) print type(data), len(data), pickle.loads(data) == value # binary mode data = pickle.dumps(value, 1) print type(data), len(data), pickle.loads(data) == value
shutil 模块
shutil
实用模块包含了一些用于复制文件和文件夹的函数. Example 2-4 中使用的 copy
函数使用和 Unix 下 cp
命令基本相同的方式复制一个文件.
2.3.0.1. Example 2-4. 使用 shutil 复制文件
File: shutil-example-1.py import shutil import os for file in os.listdir("."): if os.path.splitext(file)[1] == ".py": print file shutil.copy(file, os.path.join("backup", file)) aifc-example-1.py anydbm-example-1.py array-example-1.py ...
copytree
函数用于复制整个目录树 (与 cp -r
相同), 而 rmtree
函数用于删除整个目录树 (与 rm -r
). 如 Example 2-5 所示.
2.3.0.2. Example 2-5. 使用 shutil 模块复制/删除目录树
File: shutil-example-2.py import shutil import os SOURCE = "samples" BACKUP = "samples-bak" # create a backup directory shutil.copytree(SOURCE, BACKUP) print os.listdir(BACKUP) # remove it shutil.rmtree(BACKUP) print os.listdir(BACKUP) ['sample.wav', 'sample.jpg', 'sample.au', 'sample.msg', 'sample.tgz', ... Traceback (most recent call last): File "shutil-example-2.py", line 17, in ? print os.listdir(BACKUP) os.error: No such file or directory
shelve 模块
shelve
模块使用数据库驱动实现了字典对象的持久保存. shelve
对象使用字符串作为键, 但值可以是任意类型, 所有可以被 pickle 模块处理的对象都可以作为它的值. 如 Example 10-3 所示.
10.4.0.1. Example 10-3. 使用 shelve 模块
File: shelve-example-1.py import shelve db = shelve.open("database", "c") db["one"] = 1 db["two"] = 2 db["three"] = 3 db.close() db = shelve.open("database", "r") for key in db.keys(): print repr(key), repr(db[key]) 'one' 1 'three' 3 'two' 2
Example 10-4 展示了如何使用 shelve 处理给定的数据库驱动.
10.4.0.2. Example 10-4. 使用 shelve 模块处理给定数据库
File: shelve-example-3.py import shelve import gdbm def gdbm_shelve(filename, flag="c"): return shelve.Shelf(gdbm.open(filename, flag)) db = gdbm_shelve("dbfile")