菜鳥學Python第十五天
菜鳥學Python第十五天
補充內容:
解決模組迴圈匯入的兩種方法:(不得已而為之,表示程式結構不夠嚴謹)
-
將匯入模組語句放在檔案最下方
-
將匯入語句放進函式體內 使其不影響整個函式的執行
包
1.什麼是包
-
包是一種管理python模組名稱空間的形式,採用‘點模組名稱’的匯入方式
比如一個模組的名稱是A.B,那麼它表示一個包A中子模組B
-
包就是一個含有__ init__.py檔案的資料夾
__ init __ .py : 匯入包就是導__ init __
2.為什麼要用包
-
包的本質就是一個資料夾,用來對內部模組進行組織管理,從而達到提高程式的結構性和可維護性。
3.如何用包
-
包的匯入
-
絕對匯入
以執行檔案路徑為準,在執行檔案中新增包所在的模組(資料夾)路徑,然後就可以在__ init __.py中新增匯入語句
# 執行檔案 import sys sys.path.append(r'包與執行檔案共同所在資料夾路徑') import 包名 包名.函式名() . . . # 包下的__ init _.py檔案(存放呼叫命令) from
-
相對匯入(僅限於包內檔案相互引用)
from . import 函式名、……
'.':表示當前檔案所在資料夾,再加一個點'.'則表示上一級資料夾,依次往上,不能超出包。
注意:絕對匯入是通用的,相對匯入只能在包內使用
-
內建模組
1.json與pickle模組
-
解決序列化的問題(Json:字串;pickle:bytes)
-
什麼是序列化
序列化就是將記憶體中的資料型別轉成另一種格式
即:
序列化:字典————序列化————其他格式————存到硬碟
反序列化:硬碟————讀取————讀取——其他格式————反序列化————字典
-
為什麼要序列化
-
將程式執行的資料序列化後永久儲存到硬碟
-
資料的跨平臺互動
-
-
-
如何序列化
-
Json:
優點:這種格式是一種通用格式,所有的程式語言都能識別
缺點:不能識別所有python型別
強調:json格式只有雙引號,不能識別單引號
-
json.dumps:將 Python 物件編碼成 JSON 字串,序列化
-
json.loads:將已編碼的 JSON 字串解碼為 Python 物件,反序列化
-
import json dic1 = {'k1': 'value', 'k2': 'v2', 'k3': 'v3', 'k4': '你好啊'} dic_j = json.dumps(dic1) # 序列化 with open(r'js.json', 'w', encoding='utf-8') as f1: json.dump(dic1, f1) # 序列化+持久化(即儲存下來) with open('js.json', mode='rt', encoding='utf-8') as f: dic_j=f.read() # 將檔案讀到記憶體 dic2 = json.loads(dic_j) # 在記憶體中反序列化 with open(r'js.json', 'r', encoding='utf-8') as f: print(json.load(f)) # 直接在檔案中反序列化 # dumps和loads方法都在記憶體中轉換,dump和load的方法會多一個步驟,dump是把序列化後的字串寫到一個檔案中,而load是從一個一個檔案中讀取檔案
json將中文轉為Unicode16進位制
-
-
pickle
優點:能識別所有python型別
缺點:只能別python這種程式語言識別
序列化:pickle.dumps() \ pickle.dump
反序列化:pickle.loads \ pickle.load
# dumps dic_pkl=pickle.dumps({1,2,3,4}) # 序列化 print(dic_pkl) with open('b.pkl',mode='wb') as f: # 注意檔案模式為B模式 f.write(dic_pkl) # 儲存(持久化) # dump with open('c.pkl',mode='wb') as f: pickle.dump(dic,f) # 序列化寫入檔案 # loads with open('b.pkl',mode='rb') as f: s_pkl=f.read() # 讀取到記憶體 s=pickle.loads(s_pkl) # 反序列化 print(type(s)) # load with open('c.pkl',mode='rb') as f: dic=pickle.load(f) # 在檔案中反序列化 print(dic,type(dic))
-
2.time & date time
-
time
時間分為三種格式
-
時間戳(從1970.1.1 00:00到當前的時間秒數)
print(time.time())
-
格式化的字串時間表
print(time.strftime('%Y-%m-%d %H:%M:%S %p')) # 得到年-月-日 時-分-秒 上下午
-
結構化的時間
print(time.localtime()) # 展示時間
print(time.localtime().tm_mday) # 展示month day 今天是這個月的第幾天
-
時間的轉換
-
data time
#時間加減 import datetime print(datetime.datetime.now()) # 返回當前時間
print(datetime.date.fromtimestamp(time.time()) ) # 時間戳直接轉成日期格式 2018-12-05 print(datetime.datetime.now() ) print(datetime.datetime.now() + datetime.timedelta(3)) #當前時間+3天 print(datetime.datetime.now() + datetime.timedelta(-3)) #當前時間-3天 print(datetime.datetime.now() + datetime.timedelta(hours=3)) #當前時間+3小時 print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #當前時間+30分 c_time = datetime.datetime.now() print(c_time.replace(minute=3,hour=2)) #時間替換,替換當前時間的時和分比如2018-12-05 19:00:00 pm替換為2018-12-05 02:03:00 pm
3.random 模組(隨機數)
import random print(random.random()) # 大於0且小於1之間的小數 print(random.randint(1,3)) #[1,3]大於等於1且小於等於3之間的整數 print(random.randrange(1,3)) #[1,3)大於等於1且小於3之間的整數 print(random.choice([1,'23',[4,5]])) #1或者23或者[4,5] print(random.sample([1,'23',[4,5]],2)) #列表元素任意2個組合 print(random.uniform(1,3)) #大於1小於3的小數,如1.927109612082716 item=[1,3,5,7,9] random.shuffle(item) # 隨機打亂item的順序,相當於"洗牌" print(item)
# 編寫一個隨機驗證碼生成器,要求驗證碼由字母與數字組成 import random def test(digit_size): # digit_size 自定義驗證碼位數 res = '' for i in range(digit_size): num = str(random.randint(0, 9)) # 隨機數字 u_alp = chr(random.randint(65, 90)) # 隨機大寫字母,chr(ASCII小寫字元對應數字) l_alp = chr(random.randint(97, 122)) # 隨機小寫字母 res += random.choice([num, u_alp, l_alp]) # 隨機三種格式之一,並實現字串的拼接 return res i_digit_size = input('請輸入隨機驗證碼位數:') print(test(i_digit_size))