1. 程式人生 > >菜鳥學Python第十五天

菜鳥學Python第十五天

菜鳥學Python第十五天

 

 

補充內容:

解決模組迴圈匯入的兩種方法:(不得已而為之,表示程式結構不夠嚴謹)

  1. 將匯入模組語句放在檔案最下方 保證語句匯入之前函式內程式碼能夠被執行

  2. 將匯入語句放進函式體內 使其不影響整個函式的執行


 

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
      包名.檔名…… import 函式名…… ……
       
    • 相對匯入(僅限於包內檔案相互引用)

      from . import 函式名、……

      '.':表示當前檔案所在資料夾,再加一個點'.'則表示上一級資料夾,依次往上,不能超出包。

      注意:絕對匯入是通用的,相對匯入只能在包內使用


 

內建模組

1.json與pickle模組

  • 解決序列化的問題(Json:字串;pickle:bytes)

  • 什麼是序列化

    序列化就是將記憶體中的資料型別轉成另一種格式

    即:

    序列化:字典————序列化————其他格式————存到硬碟

    反序列化:硬碟————讀取————讀取——其他格式————反序列化————字典

  • 為什麼要序列化

    1. 將程式執行的資料序列化後永久儲存到硬碟

    2. 資料的跨平臺互動

    • 如何序列化

      • 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

    時間分為三種格式

  1. 時間戳(從1970.1.1 00:00到當前的時間秒數)

    print(time.time())

  2. 格式化的字串時間表

    print(time.strftime('%Y-%m-%d %H:%M:%S %p')) # 得到年-月-日 時-分-秒 上下午

  3. 結構化的時間

    print(time.localtime()) # 展示時間

    print(time.localtime().tm_mday) # 展示month day 今天是這個月的第幾天

  1. 時間的轉換

 

 

  

 

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