1. 程式人生 > >常用模組-01

常用模組-01

本節主要內容:

1. 模組的簡單認識

2. collections模組

3. time時間模組

4. random模組

5. os模組

6. sys模組

一. 模組的簡單認識

 什麼是模組. 模組就是我們把裝有特定功能的程式碼進行歸類的結果. 從程式碼編寫的單位 來看我們的程式, 從小到大的順序:

一條程式碼 < 語句塊 < 程式碼塊(函式, 類) < 模組. 我們目前寫 的所有的py檔案都是模組.

引入模組的⽅方式:            

1. import 模組           

2. from xxx import 模組       

關於這兩種寫法. 我們後⾯面還要繼續介紹. 在之前的學習中, 我們已經用過了一些基本的 模組了了. 比如, random, os, sys, collections等等. 那我們目前⽤用到的所有模組都是python內 置的模組.不需要額外安裝. 在後⾯面學習⾼高階框架的內容的時候. 可能需要我們⾃行安裝一些 第三方提供的模組.

二. collections模組

collections模組主要封裝了一些關於集合類的相關操作. 比如, 我們學過的Iterable, Iterator等等.  除了了這些以外, collections還提供了一些除了基本資料型別以外的資料集合類 型. Counter, deque, OrderDict, defaultdict以及namedtuple

 1. Counter           

counter是一個計數器. 主要用來計數       

計算一個字串中每個字元出現的次數:

from collections import Counter
s = "I am sylar, I have a dream, freedom...."
qq = counter(s)
print(s)

2. deque 雙向佇列

(重點)說雙向佇列列之前我們需要了了解兩種資料結構. 1. 棧, 2. 佇列           

1. 棧:  FILO. 先進後出  -> 砌牆的磚頭, 老師傅做饅頭           

2. 佇列: FIFO. 先進先出  -> 買火車票排隊, 所有排隊的場景

# class StackFullError(Exception):
#     pass
# class StackEmptyError(Exception):
#     pass
#
# class Stack:
#     def __init__(self, size):
#         self.index = 0 #  棧頂指標
#         self.lst = []
#         self.size = size
#
#     # 給棧新增元素
#     def push(self, item):
#         if self.index == self.size:
#             # 棧已經滿了. 不能再裝東西了
#             raise StackFullError('the stack is full')
#         self.lst.insert(self.index, item) # 對於空列表. 需要insert插入內容
#         # self.lst[self.index] = item # 把元素放到棧裡
#         self.index += 1     # 棧頂指標向上移動
#
#     # 從棧中獲取資料
#     def pop(self):
#         if self.index == 0:
#             raise StackEmptyError("the stack is empty")
#         self.index -=1 # 指標向下移動
#         item = self.lst.pop(self.index) # 獲取元素. 刪除.
#         return item
# s = Stack(5)
# s.push("饅頭1號")
# s.push("饅頭2號")
# s.push("饅頭3號")
# s.push("饅頭4號")
# s.push("饅頭5號")
#
# print(s.pop())
# print(s.pop())
# print(s.pop())
# print(s.pop())
# print(s.pop())

 佇列

# import queue
# #
# q = queue.Queue() # 建立佇列
# q.put("李嘉誠")
# q.put("陳冠希")
# q.put("周潤發")
# q.put("吳彥祖")
#
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
# # print(q.get()) # 佇列中如果沒有元素了. 繼續獲取的話. 會阻塞
# print("拿完了")

 雙向佇列

# from collections import deque
#
# q = deque() # 建立一個雙向佇列
# q.append("高圓圓")
# q.append("江疏影")
# q.appendleft("趙又廷")
# q.appendleft("劉大哥")
# #  劉大哥 趙又廷 高圓圓 江疏影
# print(q.pop()) # 從右邊獲取資料
# print(q.pop())
# print(q.popleft()) # 從左邊獲取資料
# print(q.popleft())
# print(q.pop())

3. namedtuple 命名元組

# from collections import namedtuple
#
# point = namedtuple("Point", ["x", "y", 'z']) # 這個就相當於寫了一個類
# # class point:
# #     def __init__(self, x, y):
# #         self.x = x
# #         self.y = y
#
# p = point(5, 18, 88)
# print(p.x)
# print(p.y)
# # p.x = 19 # 終歸是一個元組
# print(p)

4. orderdict和defaultdict

# dic = {'a':'娃哈哈', 'b':'薯條', 'c':'胡辣湯'}
# print(dic) # 最底層一定是無序的. 最底層是hash
#
# from collections import OrderedDict
# # 按照我們儲存的順序儲存資料
# od = OrderedDict({ 'b':'薯條','a':'娃哈哈', 'c':'胡辣湯'})
# print(od)
# lst= [11,22,33,44,55,66,77,88,99]
# d = defaultdict(list)
# for el in lst:
#     if el < 66:
#         d["key1"].append(el) # key1預設是不存在的. 但是可以拿key1. 一個空列表.
#     else:
#         d["key2"].append(el)
# print(d)

 三. time 時間模組(重點)

  時間模組是我們要熟記的. 到後面寫程式的時候經常能用到. 比如, 如何計算時間差. 如何按照客戶的要求展示時間. 等等.

import time

print(time.time())  # 1538927647.483177  系統時間

日期格式化的標準:

%y 兩位數的年年份表示(00-99) %Y 四位數的年年份表示(000-9999) %m ⽉月份(01-12) %d ⽉月內中的⼀一天(0-31) %H 24⼩小時制⼩小時數(0-23) %I 12小時制⼩小時數(01-12) %M 分鐘數(00=59) %S 秒(00-59) %a 本地簡化星期名稱 %A 本地完整星期名稱
%b 本地簡化的⽉月份名稱 %B 本地完整的⽉月份名稱 %c 本地相應的⽇日期表示和時間表示 %j 年年內的⼀一天(001-366) %p 本地A.M.或P.M.的等價符 %U ⼀一年年中的星期數(00-53)星期天為星期的開始 %w 星期(0-6),星期天為星期的開始 %W ⼀一年年中的星期數(00-53)星期⼀一為星期的開始 %x 本地相應的⽇日期表示 %X 本地相應的時間表示 %Z 當前時區的名稱 %% %號本身

從時間戳 -> 格式化時間

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")

 


# 時間差  1小時30分
# 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 ))   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.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 import sys
# sys.exit(1) # 正常退出 # print(sys.version)
# print(sys.platform) # 平臺名稱
print(sys.path) #  搜尋模組的路徑
sys.path.append("e:/")
import master
master.chi()   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)是建立時間(詳細資訊參⻅見平臺的⽂文件)。