本節主要內容: 1.模塊的簡單認識 2.collections模塊 3.time時間模塊 4.random模塊 5.os模塊 6.sys模塊 一.模塊的簡單認識 模塊:就是我們把裝有特定功能的代碼進行歸類的結果. 引入模塊的方式 1.import 模塊 2.from xxx import 模塊 二. ...
本節主要內容:
1.模塊的簡單認識
2.collections模塊
3.time時間模塊
4.random模塊
5.os模塊
6.sys模塊
一.模塊的簡單認識
模塊:就是我們把裝有特定功能的代碼進行歸類的結果.
引入模塊的方式
1.import 模塊
2.from xxx import 模塊
二.collections模塊
collections模塊主要封裝了一些關於集合類的相關操作.例如:Iterable,Iterator等等.
1.Counter
counter是一個計數器,主要用來計數
計算一個字元串中每個字元出現的次數:
from collections import Counter s = "life is a chocolate" ss = Counter(s) print(ss) # 結果: # Counter({' ': 3, 'l': 2, 'i': 2, 'e': 2, 'a': 2, 'c': 2, 'o': 2, 'f': 1, 's': 1, 'h': 1, 't': 1})
2.deque雙向隊列
在說雙向隊列之前我們先瞭解兩種數據結構:
1.棧:FILO.它的特點是先進後出
2.隊列:FIFO.先進先出
由於python中沒有給出棧(stack)模塊,我們可以粗略寫一個棧的模塊:
class StackFullError(Exception): pass class StackEmptyError(Exception): pass # class Stack: def __init__(self,size): self.size = size self.index = 0 self.lst = [] def push(self,el): if self.index == self.size: raise StackFullError("the stack is full") self.lst.insert(self.index,el) self.index += 1 def pop(self): if self.index == 0: raise StackEmptyError self.index -= 1 c =self.lst.pop(self.index) return c st = Stack(3) st.push("早上好") st.push("中午好") st.push("晚上好") print(st.pop()) print(st.pop()) print(st.pop())
隊列:python提供了queue模塊.使用起來非常方便
import queue q = queue.Queue() q.put("劉德華") q.put("張學友") q.put("郭富城") print(q) print(q.get()) print(q.get()) print(q.get()) # print(q.get()) #隊列中如果沒有元素了,繼續獲取的話,會阻塞
註意.如果隊列里沒有元素了.再也就拿不出來元素了,此時程式會阻塞.
雙向隊列deque,此隊列是collections中的.
from collections import deque q = deque() q.append("Mandy") q.append("Cassie") # 右側添加 q.appendleft("Luis") # 左側天劍 q.append("Hans") print(q.pop()) # 右側刪除 print(q.popleft()) # 左側刪除 print(q.pop()) print(q.popleft())
3.namedtuple 命名元組
命名元組: 給元組內的元素進行命名.
from collections import namedtuple # 定義元組,其實相當於創建了一個類 ppp = namedtuple("hah",["x","y","c"]) p = ppp(1,2,3) print(p) # p.c = 15 # 報錯,因為ppp始終是個元組,元組不能進行增刪改操作 print(p.y)
4.orderdict 和 defaultdict
orderdict: 字典的key預設是無序的,而OrderDict是有序的
dic = {'a':'娃哈哈', 'b':'薯條', 'c':'胡辣湯'} print(dic) from collections import OrderedDict od = OrderedDict({'a':'娃哈哈', 'b':'薯條', 'c':'胡辣湯'}) print(od)
由於python3.5後的版本列印字典都預設按輸入時順序列印,所以看不出效果.但是內部儲存還是無序的,因為字典的key是按hash列表儲存的.
defaultdict: 可以給字典設置預設值.當key不存在時.直接獲取預設值:
from collections import defaultdict dc = defaultdict(list) # 括弧裡面的是一個可被調用的對象 print(dc["周星馳"]) # 結果: []
三.time時間模塊(重點)
時間模塊是一個經常要用到的模塊.比如,如何計算時間差,如何按照客戶的要求展示時間.等等.
import time print(time.time()) # 1538927647.483177 系統時間
上面獲取到的這個時間是一個數字又叫時間戳.
在python中時間分成三種表現形式:
1.時間戳(timestamp). 時間戳使用的是從1970年01月01日 00點00分00秒到現在一共經過了多少秒,使用float來表示.
2.格式化時間(strftime),這個時間可以根據我們的需要對時間進行任意的格式化.
3.結構化時間(struct_time).這個時間可以把主要時間進行分類劃分.比如1970年01月01日 00點00分00秒 這個時間可以被細分為年,月,日,星期,等等...
我們一般展示給客戶看的時間都是進行格式化後的時間,而不是時間戳.
s = time.strftime("%Y-%m-%d %H:%M:%S") # 必須記住 print(s)
# 從時間戳 -> 格式化時間 t = time.localtime(1542513992) # 時區 gmtime() 格林尼治時間. print(t) str_time = time.strftime("%Y-%m-%d %H:%M:%S", t) print(str_time)
結果: 2018-11-18 12:06:32
日期格式化的標準:
%y 兩位數的年份表示(00-99)
%Y 四位數的年份表示(0000-9999)
%m 月份(01-12
%d 月內中的一天(0-31)
%H 24小時制小時數(0-23)
%I 12小時制小時數(01-12)
%M 分鐘數(0-59)
%S 秒 (00-59)
%a 本地簡化星期名稱
%A本地完整星期名稱
%b 本地簡化的月份名稱
%B 本地完整的月份名稱
%c 本地相應的日期表示和時間表示
%j 年內的一天(001-366)
%p 本地A.M.或P.M.的等價符
%U 一年中的星期數(00-53)
%w 星期(0-6),星期天為星期的開始
%x 本地相應的日期表示
%X 本地相應的時間表示
%Z 當前時區的名稱
%% %號本身
結構化時間:
print(time.localtime()) 結果: time.struct_time(tm_year=2017, tm_mon=05, tm_mday=8, tm_hour=10, tm_min=24, tm_sec=42, tm_wday=0, tm_yday=126, tm_isdst=0)
時間的轉換:所有的轉化都要通過結構化時間來轉化
# 資料庫里存了一個時間戳 1888888888 # 從時間戳 -> 格式化時間 t = time.localtime(1542513992) # 時區 gmtime() 格林尼治時間. print(t) str_time = time.strftime("%Y-%m-%d %H:%M:%S", t) print(str_time) 用戶輸入一個時間. 變成時間戳 格式化時間 -> 時間戳 2018-11-18 12:06:32 s = "2018-11-18 12:06:32" t = time.strptime(s, "%Y-%m-%d %H:%M:%S") # string parse time print(t) # 結構化時間 -> 時間戳 ss = time.mktime(t) print(ss) print(time.strftime("%Y年%m月%d日")) # 中文 import locale locale.setlocale(locale.LC_CTYPE, "chinese")
計算時間差:
第一種演算法:
begin = "2018-11-14 16:30:00" end = "2018-11-14 18:00:00" # 用時間戳計算出時間差(秒) begin_struct_time = time.strptime(begin, "%Y-%m-%d %H:%M:%S") end_stract_time = time.strptime(end, "%Y-%m-%d %H:%M:%S") begin_second = time.mktime(begin_struct_time) end_second = time.mktime(end_stract_time) # 秒級的時間差 180000 diff_time_sec = abs(begin_second - end_second) # 轉換成分鐘 diff_min = int(diff_time_sec//60) print(diff_min) diff_hour = diff_min//60 # 1 diff_min_1 = diff_min % 60 # 30 print("時間差是 %s小時%s分鐘" % (diff_hour, diff_min_1))
第二種演算法:
begin = "2019-11-14 16:30:00" end = "2018-11-14 18:00:00" # 用時間戳計算出時間差(秒) begin_struct_time = time.strptime(begin, "%Y-%m-%d %H:%M:%S") end_stract_time = time.strptime(end, "%Y-%m-%d %H:%M:%S") begin_second = time.mktime(begin_struct_time) end_second = time.mktime(end_stract_time) # 秒級的時間差 180000 diff_time_sec = abs(begin_second - end_second) # 轉化成結構化時間 t = time.gmtime(diff_time_sec) # 最好用格林尼治時間。 否則有時差 print(t) print("時間差是%s年%s月 %s天 %s小時%s分鐘" % (t.tm_year-1970, t.tm_mon-1, t.tm_mday-1,t.tm_hour, t.tm_min ))
關於time模塊還需要去看的內容: datetime(時間), calender(日曆)
四.random模塊
所有關於隨機相關的內容都在random模塊中.
import random print(random.randint(1,2)) # [start, end] print(random.random()) # (0,1)之間的小數 print(random.uniform(3,10)) # (3, 10 )的隨機小數 n = random.randrange(1, 10, 3) # [1, 10) 從奇數中獲取到隨機數 while n != 10: n = random.randrange(1, 10, 3) for i in range(1, 10, 3): print(i) print(random.choice([1, '周傑倫', ["蓋倫", "胡辣湯"]])) # 列表中的任意一個元素 print(random.sample([1, '23', [4, 5]], 2)) # 列表元素任意2個組合 lst = ["周傑倫", "昆凌", "馬化騰", "馬麗", "沈騰", "秋雅"] random.shuffle(lst) # 隨機打亂順序 print(lst)
五.os模塊
所有和操作系統相關的內容都在os模塊
import os os.makedirs('dirname1/dirname5') # 創建文件夾目錄結構 os.removedirs('dirname1/dirname5') # 刪除文件夾, 如果文件夾內沒有東西。 就可以刪除。 否則報錯 os.mkdir('dirname/哈哈') # mkdir如果父級目錄不存在。 報錯 os.rmdir('dirname') # 刪除文件夾 print(os.listdir('../')) # 獲取到文件夾內的所有內容. 遞歸 print(os.stat('dirname')) # linux os.system("dir") # 直接執行命令行程式 s = os.popen("dir").read() print(s) print(os.getcwd() ) # 當前程式所在的文件夾 print(os.path.abspath("../day020 繼承") ) # 獲取絕對路徑 print(os.path.split("D:\python_workspace\day020 繼承")) # 拆分路徑 ('D:\\python_workspace', 'day020 繼承') print(os.path.dirname("D:\python_workspace\day020 繼承")) # D:\python_workspace print(os.path.basename("D:\python_workspace\day020 繼承")) # day020 繼承 print(os.path.exists("dirname")) # 判斷文件是否存在 print(os.path.isabs("D:\python_workspace\day020 繼承")) # 是否是絕對路徑 print(os.path.isfile("01 今日主要內容")) # 是否是文件 print(os.path.isdir("dirname")) # 是否是文件夾 print(os.path.getsize("01 今日主要內容") ) # 文件大小 print("胡辣湯", "傳盛", "big", sep="small") print("c:"+os.sep+"胡辣湯") # \\/ 文件路徑的分隔符 print(os.name) # nt
os.stat()屬性解讀:
stat 結構: st_mode: inode 保護模式 st_ino: inode 節點號。 st_dev: inode 駐留的設備。 st_nlink: inode 的鏈接數。 st_uid: 所有者的用戶ID。 st_gid: 所有者的組ID。 st_size: 普通文件以位元組為單位的⼤小;包含等待某些特殊文件的數據。 st_atime: 上次訪問的時間。 st_mtime: 最後一次修改的時間。 st_ctime: 由操作系統報告的"ctime"。在某些系統上(如Unix)是最新的元數據更改的時間,在其它系統上(如Windows)是創建時間(詳細信息參見平臺的文檔)。
六.sys模塊
所有和python解釋器相關的都在sys模塊:
sys.argv 命令行參數List,第一個元素是程式本身路徑 sys.exit(n) 退出程式,正常退出時exit(0),錯誤退出sys.exit(1) sys.version 獲取Python解釋程式的版本信息 sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變數的值 sys.platform 返回操作系統平臺名稱