1. 程式人生 > >python D21 基本模板、time/os/sys

python D21 基本模板、time/os/sys

今日大綱:
# 1、關於模組
# import
# from xxx import xxx
# 2、Collections
# 1、Counter 計數器
# 2、棧:先進後出
# 佇列:先進先出
# deque:雙向佇列
# 3、defaultdict 預設值字典
# 4、namedtuple命名元組, struct time結構化時間就是命名元組
# 5、OrederedDict 有序字典。 按照我們儲存的順序儲存. 和3.6以後的字典一樣的
# 3、time 時間模組
# 1、獲取系統時間 time.time() 時間戳
# 2、格式化時間 strftime() 時間格式: %Y-%m-%d %H:%M:%S %Y-%m-%d
# 3、結構化時間 time.gmtime() time.localtime()
# strptime() 把格式化時間轉化成結構化時間
# mktime() 把結構化時間轉化成時間戳
# 時間差的計算
# 一、模組的簡單認識
# 什麼是模組,模組就是我們把特定功能程式碼進行歸類的結果,從程式碼編寫單位來看
# 我們的程式,從小到大的順序:一條程式碼 < 語句塊 < 程式碼塊(函式、類)< 模組。
# 我們之前寫的所有的py檔案都是模組
# 引入模組的方式:
# 1、import
# from xxx improt模組

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

# 1、Counter
# counter是一個計算器,主要來計數
# 計算一個字串中美俄字元出現的次數:
# from collections import Counter
# # low:
# s = "alex like pig"
# dic = {}
# for c in s:
# dic[c] = dic.get(c, 0) + 1
# print(dic) # {'a': 1, 'l': 2, 'e': 2, 'x': 1, ' ': 2, 'i': 2, 'k': 1, 'p': 1, 'g': 1}
#
# # nb:
# s = "alex like pig"
# print(Counter(s)) # Counter({'l': 2, 'e': 2, ' ': 2, 'i': 2, 'a': 1, 'x': 1, 'k': 1, 'p': 1, 'g': 1}) # 獲取到的結果可以像字典⼀樣進⾏使⽤ [key]

# 2、deque雙向佇列
# 先了解兩種資料結構:1.棧 2.佇列
# 1、棧:FILO先進後出 ->砌牆的磚頭,做饅頭
# 2、對列:FIFO 先進先出-> 買火車票排隊,所有排隊的場景
# python中沒有棧、自定義棧(粗略版本)
class StockEmptyError(Exception): # 自定義異常
    pass
class StackFullError(Exception):
    pass
class Stack:  # 定義一個類(簡易的棧)
    def __init__(self, size):
        self.size = size
        self.index = 0
        self.lst = []

    def push(self, items):
        self.index += 1
        if self.index <= self.size:
            self.lst.append(items)
        
else: raise StockEmptyError("裝滿了") def pop(self): self.index -= 1 if self.index >= 0: self.lst.pop() else: raise StackFullError("拿完了") s = Stack(5) s.push("一號") s.push("2號") s.push("3號") s.push("4號") s.push("5號") # s.push("6號") # 超過報錯 # s.push("7號") s.pop() s.pop() s.pop() s.pop() s.pop() s.pop() # 拿完了
# 佇列:python提供了queue模板,使用起來非常方便
# import queue # 引入模組 建立佇列
# dui = queue.Queue() # 固定搭配 建立佇列
# dui.put("劍聖") # put() 往佇列裡放東西
# dui.put("微恩")
# dui.put("小丑")
# dui.put("趙信")

# print(dui.get()) # get()往佇列裡拿東西
# print(dui.get())
# print(dui.get())
# print(dui.get())
# # print(dui.get()) # 拿完了 程式會阻塞在這裡 阻塞:程式沒有結束,一直卡在那

# 雙向佇列 deque,此佇列是collections中的
# from collections import deque # 從collections模板應用deque(雙向佇列)
# x = deque() # 建立雙向佇列
# x.append("jay") # 右邊加元素
# x.append("周杰倫")
#
# x.appendleft("jj")
# x.appendleft("林俊杰") # 左邊加元素
#
# print(x.pop()) # 右邊拿元素
# print(x.popleft()) # 左邊拿元素

# 3、namedtuple命名元組
# 命名元組,顧名思義,給元組內的元素進行命名,比如,我們說(x,y)這是一個元組,同時
# 我們還可以認為這是一個點座標,這時,我們可以使用namedtuple對元素進行命名

# from collections import namedtuple # 從collections應用命名元組
# point = namedtuple("點點", ["x", "y", "z"]) # 裡面的引數個數無限制、引數型別無限制
# p = point(4, 7, 9)
# print(p) # 點點(x=4, y=7, z=9)
#
# point = namedtuple("點點", ["x", "y", "z"])
# p = point("你好啊", 7, 9)
# print(p) # 點點(x='你好啊', y=7, z=9)

# 4、orderdict和defaultdict
# orderdict 顧名思義,字典key預設是無序的,而OrderedDict是有序的
# dic = {'a': '娃哈哈', 'b': '薯條', 'c': '胡辣湯'} # 在python3以後的版本中字典顯示是有序的,但在底層python底層程式碼中排列還是無序的
# print(dic)
# from collections import OrderedDict
# od = OrderedDict({'a': '娃哈哈', 'b': '薯條', 'c': '胡辣湯'})
# print(od)

# defaultdict:可以給字典設定預設值,當key不存在時,直接獲取預設值
# d = defaultdict(list) # 給字典d設定一個預設值,如果在d中拿不到key,則返回list()
# print(d["周杰倫"]) # []
#
# d = defaultdict(str)
# print(d["周杰倫"])
#
# from collections import defaultdict #呼叫defaultdict
# # d = {"周杰倫": "昆凌"} # 字典預設為空字典
# d = defaultdict(list) # defaultdict 引數必須是可呼叫的(可呼叫:表示引數+()能執行)
# d["周杰倫"] = "昆凌"
# print(d["周杰倫"]) # 昆凌

# 三、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秒 這個時間可以被細分為年, ⽉, ⽇.....⼀⼤堆東⻄.
# 時間戳我們已經⻅過了就是time.time(). ⼀般, 我們不會把這樣的時間顯⽰給客戶. 那
# 就需要對時間進⾏格式化操作.
# s = time.strftime("%Y-%m-%d %H:%M:%S") # 2018-11-15 17:41:48 # 必須記住
# print(s)

# 日期格式化的標準
# %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 本地完整星期名稱
# %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 本地完整星期名稱

# 看⼀下結構化時間:
# 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)
# 顯示當前格式化時間:
# time_now = time.strftime("%Y-%m-%d %H:%M:%S")

# while True: # 計時器
# time_now = time.strftime("%Y-%m-%d %H:%M:%S") # strftime == string fromat time
# print(time_now)
# time.sleep(1) #休眠一秒

# 時間戳->結構化時間->格式化時間
# t1 = time.time() #2018-11-14 12:23:15 顯示當前時間
# t = time.localtime(1888888)
# print(t) # 列印結構化時間
# t2 = time.strftime("%Y-%m-%d %H:%M:%S", t) # 將結構化時間轉換成格式化時間
# print(t2) # 列印格式化時間

# 格式化時間->結構化時間->時間戳
# s = "2018-11-4 12:18:56"
# s1 = time.strptime(s, "%Y-%m-%d %H:%M:%S") # 將格式化時間轉化為結構化時間
# print(s1)
# s2 = time.mktime(s1) # 將結構化時間轉化為時間戳
# print(s2) #1541305136.0

# 1、time 模板
# time.time():顯示當前時間
# time.strftime("%Y-%m-%d %H:%M:%S") # 顯示格式化時間/結構化時間轉化為格式化時間
# time.localtime()/time.gmtime()(沒有時間差的) # 將時間戳轉化為結構化時間 用time.localtime()中國處在東8區會有8小時時差
# time.strptime() #格式化時間轉化為結構時間
# time.mktime() # 將結構化時間轉化為時間戳

# 四、random模板
# import random
# print(random.random()) # 0-1之間的小數
# print(random.uniform(1, 10)) # 1-10之間的小數
# print(random.randint(1, 2)) # [1,2]的整數 (前閉後閉區間)
# print(random.randrange(1, 10, 2)) # 1-10裡面的奇數(前閉後開區間)
# print(random.choice([1, 2, 3, 5, 8, 11, ["燒餅"]])) # 列表隨機取出一個元素
# print(random.sample([1, 2, 3, 5, 8, 11, ["燒餅"]], 2)) # 列表中任意取兩個

# 五. os模組
# 所有和作業系統相關的內容都在os模組
# os.makedirs('dirname1/dirname2') 可⽣成多層遞迴⽬錄
# os.removedirs('dirname1') 若⽬錄為空,則刪除,並遞迴到上⼀級⽬錄,如若也為空,則刪
# 除,依此類推
# os.mkdir('dirname') ⽣成單級⽬錄;相當於shell中mkdir dirname
# os.rmdir('dirname') 刪除單級空⽬錄,若⽬錄不為空則⽆法刪除,報錯;相當於shell中
# rmdir dirname
# os.listdir('dirname') 列出指定⽬錄下的所有⽂件和⼦⽬錄,包括隱藏⽂件,並以列表⽅式
# 列印
# os.remove() 刪除⼀個⽂件
# os.rename("oldname","newname") 重新命名⽂件/⽬錄
# os.stat('path/filename') 獲取⽂件/⽬錄資訊
# os.system("bash command") 運⾏shell命令,直接顯示
# os.popen("bash command).read() 運⾏shell命令,獲取執⾏結果
# os.getcwd() 獲取當前⼯作⽬錄,即當前python指令碼⼯作的⽬錄路徑
# os.chdir("dirname") 改變當前指令碼⼯作⽬錄;相當於shell下cd
# # os.path
# os.path.abspath(path) 返回path規範化的絕對路徑
# os.path.split(path) 將path分割成⽬錄和⽂件名⼆元組返回
# os.path.dirname(path) 返回path的⽬錄。其實就是os.path.split(path)的第⼀個元素
# os.path.basename(path) 返回path最後的⽂件名。如何path以/或\結尾,那麼就會返回空值。
# 即os.path.split(path)的第⼆個元素
# os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
# os.path.isabs(path) 如果path是絕對路徑,返回True
# os.path.isfile(path) 如果path是⼀個存在的⽂件,返回True。否則返回False
# os.path.isdir(path) 如果path是⼀個存在的⽬錄,則返回True。否則返回False
# os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第⼀個絕對路徑之前的引數
# 將被忽略
# os.path.getatime(path) 返回path所指向的⽂件或者⽬錄的最後訪問時間
# os.path.getmtime(path) 返回path所指向的⽂件或者⽬錄的最後修改時間
# os.path.getsize(path) 返回path的⼤⼩
# # 特殊屬性:
# os.sep 輸出作業系統特定的路徑分隔符,win下為"\\",Linux下為"/"
# os.linesep 輸出當前平臺使⽤的⾏終⽌符,win下為"\r\n",Linux下為"\n"
# os.pathsep 輸出⽤於分割⽂件路徑的字串 win下為;,Linux下為:
# os.name 輸出字串指示當前使⽤平臺。win->'nt'; Linux->'posix'
#
# 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 返回作業系統平臺名稱