Python常用的內建模組
模組:
計算機在開發過程中,程式碼越寫越多,也就也來越難以維護,所以為了編寫可維護的程式碼,我們會把函式進行分組,放在不同的檔案裡。在python裡,一個.py檔案就是一個模組。
模組的優點:
- 提高程式碼的可維護性。
- 提高程式碼的複用,當模組完成時就可以在其他程式碼中呼叫。
- 引用其他模組,包含python內建模組和其他第三方模組
- 避免函式名和變數名等名稱衝突。
模組的匯入方式
import
直接使用import語句匯入標準庫的模組:
import sys print(sys.argv) #包含命令列引數的列表 print(sys.path) #自動查詢所需模組的路徑列表 |
import 語句:
格式:import module1[, module2]
注意:一個模組只會被匯入一次,不管執行了多少次import,防止一次次的匯入記憶體中浪費記憶體
使用模組中的內容:
module.方法/變數/類
from …… import……
作用:從模組中匯入一個指定的部分
格式: from modulename import name…
from …… import *
作用:從模組中所有內容全部匯入當前名稱空間
注意:不應該過多的使用,佔用記憶體太多了。容易導致變數的衝突
#注意!!兩個匯入包的區別,以time為例 import time #第一種 time.sleep(0) from time import time #第二種 time.sleep(0) from time import * #第三種 sleep(0) """兩個在匯入之後都可以呼叫sleep但是呼叫的方法書寫格式不同,第一種和第二種是要寫上包名,而第三種直接寫方法名, 但是在我們日常編寫中,我們都是採用前兩種種方式,以防止在程式碼塊中命名的重複,和降低程式碼閱讀的難度 注意 如果想要在兩個包中能夠互相呼叫的話,採用第一種方式,這種情況一般都是用到自己寫的包的互相呼叫中 """
模組中的__name__屬性:
每個模組都有一個__name__屬性,當其值為“__main__”時,表明該模組自身在執行,
否則是被當做模組引入,此時值為模組的名字
作用:模組就是一個可執行的python檔案,一個模組被另一個模組引入,想讓模組中的
某一程式不執行,我們可以用__name__屬性來使程式隱藏該塊內碼,當自身執行時,在執行‘該塊程式碼
一般程式的其實位置都是從__name__ =="__main__"開始
包:
為了避免模組名的衝突,python又引入了按目錄來組織模組的方方 稱為包(package)
特點:引入包以後,值頂層的包名不予別人衝突,那麼所有的模組都不會與比人衝突
注意:每個包下面都會有一個名為__init__.py的檔案,可以匯出包裡的內容
from 包 import (可以是方法名字 只不過需要有init檔案 也可以是模組的名字)
如果包裡面的模組相同了
from 包.模組 import 方法
如果方法也相同了
from 包.模組 import 方法 as 變數 # 給其重新命名 之後再去操作。
內建模組:
time 模組:
UTC(世界協調時間):格林尼治時間,世界標準時間。在中國我們UTC+8
DST(夏令時):是一種為了節約能源而人為規定地方時間的制度,一般在天亮早的夏季將時間提前一小時,時間段表示形式:
1.時間戳
以整型或者浮點型表示的 是一個一秒為單位的時間間隔,這個時間的基礎是1970年的1月1日零時開始算
2.元組形式
一種python的資料表示,這個元組有9個整形元素,分別表示不同的時間含義
year month(1-12) day(1-31) hours(0-23) minutes(0-59)seconds(0-59)weekday(0-6 0為週一)
Julian day (1-366):表示當前日期在本年是第幾天,day in the year
DST flag(-1 or 0 or 1):夏令時格式,0表示正常格式,1表示為夏令時格式,-1表示根據當前的日期時間格式來判定
3.格式化字串
%a 本地簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化月份名稱
%B 本地完整月份名稱
%c 本地相應的日期和時間表示
%d 一個月中第幾天(01-31)
%H 一天中的第幾個小時(24小時制度,00-23)
%I 一天中的第幾個小時(12小時制度,01-12)
%j 一年中的第幾天(001-366)
%m 月份(01-12)
%M 分鐘數(00-59)
%p 本地am或者pm的相應符號
%S 秒(00-59)
%U 一年中的星期數,以星期日為一個星期
%w 一個星期中的第幾天(0-6,0表示星期日)
%W 和%U基本相同,以星期一為一個星期
%x 本地相應日期
%X 本地相應時間
%y 去掉世紀的年份(00-99)
%Y 完整的年份
%Z 時區的名字,如果不存在未空字串
方法:
time():返回房錢的時間戳,浮點數形式,無須傳參 t1 = time.time()
gmtime():將時間戳轉換為UTC時間元組格式,接收一個浮點型時間戳為引數,如果不傳預設為當前時間的時間戳 t2 = time.gmtime()
localtime():將時間戳轉換為本地時間元組格式,接收一個浮點型時間戳為引數,如果不傳預設為當前時間的時間戳 t3 = time.localtime()
mktime():將本地時間元組轉為時間戳,接收一個時間元組 t4 = time.mktime(t3)
asctime():將時間元組格式轉為字串形式,接收一個時間元組,不傳預設為localtime時間的時間元組 t5 = time.asctime(t3)
ctime():將時間戳轉為字串,接收一個時間戳,預設值為當前時間戳
t6 = time.ctime()
strftime():將時間元組以指定的格式轉換字串格式沒接收一個字串格式化串,時間元組,不寫預設為localtime()
t7 = time.strftime("%Y-%m-%d %X", t3)
strptime(): 將指定格式的時間字串解析為時間元組,是strftime逆過程, t8 = time.strptime()
sleep():延遲一個時間段,整型或者浮點型
clock():返回當前程式執行時間,Unix系統時鐘返回全部執行時間,而windos從第二次開始都是以第一次呼叫次函式的時間戳為基準,而不是程式開始時間為基準。
tzset():改變本地時區
datetime模組
比time高階了不少,可以理解為 datetime 基於time進行了封裝,提供了更實用的函式介面
datetime模組的介面更直觀,更容易呼叫。
模組中的類:
datetime 同時有時間和日期
timedelta 主要用於計算時間跨度
tzinfo 時區相關
time 只關注時間
date 只關注日期
獲取當前時間
t1 = datetime.datetime.now()
獲取指定時間
t2 = datetime.datetime(199, 10, 1, 8, 8, 8, 0)
將時間轉為字串
t3 = t1.strftime("%Y-%m-%d %X")
將格式化字串轉為datetime物件
t4 = datetime.datetime.strptime(t3, "%Y-%m-%d %X")
時間相減,返回一個時間間隔
t5 = datetime.datetime(199, 10, 1, 8, 8, 8, 0)
t6 = datetime.datetime(199, 10, 2, 8, 8, 8, 0)
t7 = t6 -t5 天數和時間都告訴了 t7.days 間隔天數 t7.second 出去天數的秒數
日曆模組 calendar
calendar.month(2018,8)返回某年某月
calendar.calendar(2018) 返回某一年的
calendar.isleap()判斷是否是閏年
calendar.monthrange(2018,8)返回某個月的weekday的第一天開始星期和這個月的所有天數
calendar.monthcalendar(2018,8)返回的是這個月的序列 沒有的就是0
collections模組
python內建的一個集合模組,提供了許多有用的集合類
namedtuple():
命名元組,本質是是一個函式,用它來建立一個自定義的tuple物件
規定tuple元素的個數,並可以用屬性而不是索引來引用tuple中的元素,用namedtuple定義一個新的資料型別
from collections import namedtuple
Point = namedtuple("Point",["x", "y"])
point = Point(1,2)
print(point.x, point.y)
defaultdict():
在使用dict時,如果引用的key不存在,會丟擲KeyError異常,如果希望key不存在時,也能得到一個預設的值,就使用defautdict
from collections import defaultdict
d2 = defaultdict(lambda :"XiaoHa")#預設值不存在就會得到裡面的值
d2["a"] = 1
print(d2)
print(d2["a"])
print(d2["d"])
print(d2.get("d"))
除了key值不存在時,返回的是自己設定的值外其他的都和普通的dict方法運用相同。
OrdereDict():
我們平時使用dict時,key值的存放是無序的,對dict進行的帶時,無法儲存key的順序。如果需要key值的有序性,就使用OrdereDict
from collections import OrdereDict
d3 = OrdereDict{[("a", [11, 111]), ("b", "22"),("c", "33")]}
print(d3)
print(d3["a"])
print(d3.get("a"))#字典的順序是按照存入時鍵值對的順序,其中也可以放入列表。
Counter():
Counter就是一個簡單的計數器,本質上是dict的一個子類,對列表中字串某個元素在列表中出現的數字統計,在對文章分析的時候這個會用到。
from collections import Counter
a = "XiaoHa say hello world"
c = Counter()
print(c)#一個Counter型別的
for ch in a:
c[ch] = c[ch] + 1 #對每個資料進行讀取一遍,然後再對其進行賦值得到個數
print(c)
uuid模組:
是一個128位的位元組的全域性唯一識別符號,通常由32位元組的字母穿表示,它可以保證時間和空間的唯一性,也稱為GUID
原理:
通過MAC地址、時間戳、名稱空間、隨機數、偽隨機數保證生成的ID的唯一性。
作用:
隨機生成字串,當成token使用,當成訂單號使用(要求不相同的字串)
演算法:
1、uuid1():基於時間戳的演算法
由MAC地址、當前時間戳、隨機陣列成,可以保證全球範圍沒的唯一性,但是由於MAC地址的使用時帶來的安全問題,區域網可以使用IP來代替MAC
2.、uuid2():基於分散式計算環境DCE的演算法
演算法和uuid1相同,但是不用的是把時間戳的前四位換為POSIX的UID,實際當中很少使用,在python中沒有這個函式。
3、uuid3():基於名字和MD5雜湊值的演算法
通過計算名字和名稱空間的MD4雜湊值得到的,保證了同一名稱空間中不同名字的唯一性和不同名稱空間的唯一性。但同一名稱空間的相同名字生成相同的UUID
4、uuid4():基於隨機數的演算法
由偽隨機數得到的,有一定的重複概率,概率是可以計算出來的但是機率太小。
5、uuid5():基於名字和SAH1雜湊值的演算法
演算法和uuid3相同,不同的是使用SHA1演算法
使用經驗:
1、python中沒有DCE,所以uuid忽略使用
2、uuid4存在概率性重複,由於無對映性,最好不使用
3、如果在全域性的分散式環境下,最好使用uuid1
4、若名字的唯一性要求,最好使用uuid3或uuid5
import uuid
print(uuid.uuid1())
print(uuid.uuid4())
print(uuid.uuid3(uuid.NAMESPACE_DNS,"XiaoHa"))
print(uuid.uuid3(uuid.NAMESPACE_DNS,"XiaoHa"))
print(uuid.uuid3(uuid.NAMESPACE_DNS,"haha"))
print(uuid.uuid5(uuid.NAMESPACE_DNS, "XiaoHa"))
base64模組:
概念:
用記事本開啟圖片等檔案會看到一堆亂碼,是因為二進位制檔案包含很多無法顯示的內容,所以想讓記事本能處理二進位制資料,就需要將二進位制字串轉換。base64就是一種常見的二進位制編碼方式
原理:
一個包含64個字元的陣列:["a"-"z","A"-"Z","0"-"9","+","/"]
對二進位制陣列進行處理,沒三個位元組一組,一組就是24bit,劃為4組,每組6bit,得到四個數字作為索引,然後查詢對應的表,得到相應的四個字元,就是編碼後的字串,在末尾如果不夠的話會使用=進行補位。
作用:
適用於小段內容的編碼,比如數字證書籤名,cookie,網頁中傳輸的少量二進位制資料。
注意:bsae64是一種通過查表的編碼方式,不能用於加密。
import base64
#編碼
s1 = b"hello world"
print(base64.b64encode(s1))
#解碼
s2 = b"aGVsbG8gd29ybGQ="
print(base64.b64decode(s2))
如果我們要編碼的二進位制不是3的倍數,base用\x00位元組在末尾補足,在編碼的末尾我們加上一個或者2個等號表示補了多少位元組,解碼時會自動去掉。
由於標準base64編碼後可能會出現+和/,在URL中不能直接作為引數
提供base64.urlsafe_b64encode()編碼,保證url的安全,將+和/替換成-和_,提供base64.urlsafe_b64decode()解碼
由於= 字元可能出現在base64編碼中,但是=在url、cookie裡面會造成歧義,所以很多base64編碼會把=去掉
我們可以可以自定義編碼對照表列表中64個字元的排序,但是通常是不會有人用的
hashlib模組
提供了常見的摘要演算法:如IMD5,SHA1
摘要演算法:
又稱雜湊演算法,雜湊演算法。
原理:
它通過一個函式,把任意長度的資料轉為一個長度固定的資料串(通常十六進位制的字串表示)
加密:
MD5
最常見的照耀演算法,速度快,生成的結果是128位的位元組,通常用32位的16進位制字串表示
s1 = b"XiaoHa is a good man"
m5 = hashlib.md5()
m5.updata(s1)
print(m5.hexdigest())
如果資訊量比較大,可以分多次呼叫updata,最後結果一樣
SHA1
呼叫SHA1和呼叫MD5完全一樣,SHA1的結果是160bit位元組,通常40位16進位制字串表示
s1 = b"XiaoHa is a good man"
sh1 = hashlib.sha1()
sh1.updata(s1)
print(sh1.hexdigest())
SHA256
SHA512
越安全的演算法,不僅越慢,而且摘要會更長 可能會出現兩個不同的資料通過HASH演算法後得到了相同的摘要,因為摘要演算法是將無限多的資料對映到有限的集合中,如果兩個資料的摘要相同,稱之為碰撞,但是非常渺茫
應用:
任何允許使用者登入的網站都會儲存使用者登入的使用者和密碼,那麼密碼一般儲存的是原密碼的摘要值,如果明文存到資料中,如果資料庫洩露,所有使用者資訊會暴露,正確的儲存口令的方式不是儲存明文,而是儲存口令的摘要,當用戶登入時首先會計算使用者輸入的明文口令的摘要,和資料庫中的對比,如果一致說明口令正確否則一定錯誤。
hmac模組
是使用一個key對資料進行“雜讀”後在進行的hash ,使用hmac比hash更安全,不同的key會產生不同的hash。對同一條資料,key不同得到的摘要值不同。
import hmac
s = b"XiaoHa is a good man"
key = b"haha"
h = hmac.new(key, s, digestmod = "MD5")
print(h.hexdigest())
itertools模組:
無限迭代:count(start = 0, step = 1)
cycle(iterable):把傳入的序列無限重複下去
repeat(object[, times]):把一個元素無限重複下去,如果提供了第二個引數,就可以指定重複次數
有限迭代:chain(*iterables)
把一組迭代物件串聯起來,形成一個迭代物件
import itertools
c = itertools.count()
for i in c:
print(i)
time.sleep(1)
cy = itertools.cycle("XiaoHa")
for i in cy:
print(i)
time.sleep(1)
r = itertools.repeat("XiaoHa",3)
for i in r:
print(i)
time.sleep(1)
cha = itertools.chain("ABC", "abc")
for i in cha:
print(i)
time.sleep(1)
g = itertools.groupby("aavbbbccdebfff")
for key, value in g:
print(key,list(value))
time.sleep(1)
排列組合
全排列 itertools.permutations(iterable,len)
從n個不同的元素中取出m個元素,按照一定的序列排成一列,叫做從n個元素中獲取m個元素的一個排列,當m=n時叫做全排列
組合 itertools.combinations(iterable, n)
從n個不同的元素中,任意m個元素為一組,叫做從n個不同元素中取出m個元素的組合
排列組合(笛卡爾積)itertools.product(*iterable, repeat=1, )
#全排列 數學A
p = list(itertools.permutations([1,2,3,4], 4))
print(p)
#組合 數學C
c = list(itertools.combinations([1,2,3,4],4))
print(c)
#排列組合
pc = list(["".join(x) for x in itertools.product("0123456789",repeat=4)])
print(pc)