time模組可以實現以下功能:獲得當前時間、操作時間和日期、從字串讀取時間和格式化時間爲字串
python日期可以用實數(時間戳)或9個整數的元組
日期元組的含義
索引 | 欄位 | 值 |
---|---|---|
0 | 年 | 比如20000,2001,等待 |
1 | 月 | 範圍1~12 |
2 | 日 | 範圍1~31 |
3 | 時 | 範圍0~23 |
4 | 分 | 範圍0~59 |
5 | 秒 | 範圍0~61 |
6 | 周 | 當週一爲0時,範圍0~6 |
7 | 儒歷日 | 範圍1~366 |
8 | 夏令時 | 0,1或-1 |
time模組重要函數
函數 | 描述 |
---|---|
asctime([tuple]) | 將時間元組轉換爲字串 |
localtime([secs]) | 將秒數轉換爲日期元組,以本地時間爲準 |
gmtime([secs]) | 將秒數轉換爲日期元組,以全球統一時間爲準 |
mktime(tuple) | 將時間元組轉換爲本地時間,返回時間戳 |
sleep(secs) | 休眠secs秒 |
strptime(string[, format]) | 將字串解析爲時間元組 |
strftime(format[, tuple]) | 將日期時間元組轉換爲字串,按照format給定的格式 |
time() | 當前時間(UTC爲準) |
python另外兩個和時間密切相關的模組,datetime(支援日期和時間的演算法)和timeit(幫助開發人員對程式碼段的執行時間進行計時)
random模組包括返回亂數的函數,可以用於模擬或用於產生隨機輸出的程式
random產生的數位都是僞隨機的,如果要真隨機,應該用os模組的urandon函數,random模組中的SystemRandom類也基於同種功能,可以讓數據接近正真的亂數
random模組一些重要的函數
函數 | 描述 |
---|---|
random() | 返回0<n<=1之間的實數 |
getrandbits(n) | 以長整型形式返回n個亂數 |
uniform(a, b) | 返回隨機實數n,其中a<= n <b |
randrange([start,] stop[, step]) | 返回range(start, stop, step)中的亂數 |
choice(seq) | 從序列seq中返回隨意元素 |
shuffle(seq[, random]) | 原地打亂序列seq |
sample(seq, n) | 從序列seq中選擇n個隨機且獨立的元素 |
>>> import random
>>> random.random()
0.02375061494350461
>>> random.random()
0.1865990002189728
>>> random.random()
0.7556505726173611
>>> random.random()
0.5829684896894718
>>> random.getrandbits(2)
3L
>>> random.getrandbits(2)
2L
>>> random.getrandbits(2)
3L
>>> random.getrandbits(2)
2L
>>> random.getrandbits(2)
2L
>>> random.getrandbits(2)
3L
>>> random.getrandbits(2)
1L
>>> random.getrandbits(2)
2L
>>> random.getrandbits(2)
0L
>>> random.getrandbits(2)
1L
>>> random.getrandbits(2)
0L
>>> random.uniform(10, 20)
18.98958779763359
>>> random.uniform(10, 20)
19.729827779529302
>>> random.uniform(10, 20)
11.759455219152438
>>> random.randrange(10)
5
>>> random.randrange(10)
4
>>> random.randrange(10)
1
>>> random.randrange(10)
7
>>> random.shuffle(range(15))
>>> a = range(15)
>>> random.shuffle(a)
>>> a
[8, 7, 9, 1, 6, 5, 14, 13, 2, 0, 10, 12, 11, 4, 3]
>>> random.shuffle(a)
>>> a
[9, 0, 1, 7, 14, 4, 3, 6, 10, 8, 12, 13, 11, 2, 5]
>>> random.shuffle(a)
>>> a
[9, 3, 12, 7, 0, 10, 2, 8, 13, 1, 5, 14, 11, 4, 6]
>>> random.sample(a, 3)
[5, 10, 13]
>>> random.sample(a, 3)
[13, 9, 10]
應用範例,
# 1. 獲取指定時間段內的一個隨機時間
>>> from time import *
>>> from random import *
>>> date1 = (2008, 1, 1, 0, 0, 0, -1 ,-1 ,-1)
>>> time1 = mktime(date1)
>>> time1
1199116800.0
>>> date2 = (2009, 1, 1, 0, 0, 0, -1, -1, -1)
>>> time2 = mktime(date2)
>>> time2
1230739200.0
>>> random_time = uniform(time1, time2)
>>> random_time
1228026864.2611487
>>> print(asctime(localtime(random_time)))
Sun Nov 30 14:34:24 2008
# 2. 投篩子,使用者選擇篩子數和篩子面數
>>> num = input('How many dice?')
How many dice?3
>>> sides = input('How Many sides per die?')
How Many sides per die?6
>>> s = 0
>>> for i in range(num) : s += randrange(sides) + 1
>>> print 'The result is', s
The result is 13
# 3. 發牌程式,每次按回車發一張牌
#建立一副牌
>>> values = range(1, 11) + 'Jack Queen King'.split()
>>> values
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'Jack', 'Queen', 'King']
>>> suits = 'diamonds clubs hearts spades'.split()
>>> suits
['diamonds', 'clubs', 'hearts', 'spades']
>>> deck = ['%s of %s' % (k, v) for k in values for v in suits]
>>> len(deck)
52
>>> from pprint import pprint
>>> pprint(deck[:12])
['1 of diamonds',
'1 of clubs',
'1 of hearts',
'1 of spades',
'2 of diamonds',
'2 of clubs',
'2 of hearts',
'2 of spades',
'3 of diamonds',
'3 of clubs',
'3 of hearts',
'3 of spades']
#洗牌
>>> shuffle(deck)
>>> pprint(deck[:12])
['Jack of hearts',
'7 of clubs',
'6 of clubs',
'King of spades',
'10 of spades',
'King of diamonds',
'2 of hearts',
'10 of diamonds',
'8 of clubs',
'2 of diamonds',
'10 of clubs',
'Jack of clubs']
#發牌
>>> while deck: raw_input(deck.pop())
常用的函數是open,呼叫時傳入檔名作爲參數,返回一個Shelf物件,Shelf物件當作普通字典(但是鍵一定要作爲字串)操作,完成工作(並且將內容儲存到磁碟中)後,呼叫close方法
shelv.open返回的物件返回的物件並不是普通物件,這一點要特別注意
>>> s = shelve.open(r'd:\test.dat')
>>> print s
{}
>>> s['x'] = ['a', 'b', 'c']
>>> s['x'].append('d')
>>> s['x']
['a', 'b', 'c'] #‘d’不見了
# 在Shelf物件中查詢元素時,這個物件會根據已經儲存的版本進行重新構建,給鍵賦值時她就被儲存了,上述例子的操作過程
#列表['a', 'b', 'c']儲存在鍵x下
#獲得儲存的表示,並建立新的列表,‘d’新增到副本中,修改的版本沒有儲存
#最終,再次獲得原始版本---沒有’d‘
#要想正確的使用shelve模組修改儲存的物件,需要將臨時變數系結到獲得的副本,並在修改後重新儲存這個副本
>>> temp = s['x']
>>> temp
['a', 'b', 'c']
>>> temp.append('d')
>>> temp
['a', 'b', 'c', 'd']
>>> s['x'] = temp
>>> s['x']
['a', 'b', 'c', 'd']
>>> s.close()
#python2.4後還有個解決方法,將open函數的writeback參數設爲true,如果這樣做,所有從shelf讀取或賦值到shelf的數據結構都儲存到記憶體(快取)中,並且只有關閉時才寫回到磁碟
簡單的數據庫應用範例
#! /bin/sh
# -*- coding -*-
# database.py
import sys, shelve
def store_person(db):
"""
Query user for data and store it in the shelf object
"""
pid = raw_input('Enter unique ID number:')
person = {}
person['name'] = raw_input('Enter name:')
person['age'] = raw_input('Enter age:')
person['phone'] = raw_input('Enter phone number:')
db[pid] = person
def lookup_person(db):
"""
Query user for ID and desired field, and fetch the corresponding data from
"""
pid = raw_input('Enter ID number:')
field = raw_input('What would you like to know?(name, age, phone) ')
field = field.strip().lower()
print field.capitalize() + ':', db[pid][field]
def print_help():
print '*************** Menu ******************'
print 'The available command are:'
print 'store : Stores information about a person'
print 'lookup : Looks up a persion from ID number'
print 'quit : Save changes and exit'
print '? : Prints this message'
def enter_command():
cmd = raw_input('Enter command(? for help):')
cmd = cmd.lstrip().lower()
return cmd
def main():
database = shelve.open(r'd:\test.dat')
try:
while True:
cmd = enter_command()
if cmd == 'store':
store_person(database)
elif cmd == 'lookup':
lookup_person(database)
elif cmd == '?':
print_help()
elif cmd == 'quit':
break
finally:
database.close()
if __name__ == "__main__":
main()