1. 程式人生 > >Python常用的內建模組

Python常用的內建模組

模組:

計算機在開發過程中,程式碼越寫越多,也就也來越難以維護,所以為了編寫可維護的程式碼,我們會把函式進行分組,放在不同的檔案裡。在python裡,一個.py檔案就是一個模組。

模組的優點:

  1. 提高程式碼的可維護性。
  2. 提高程式碼的複用,當模組完成時就可以在其他程式碼中呼叫。
  3. 引用其他模組,包含python內建模組和其他第三方模組
  4. 避免函式名和變數名等名稱衝突。

模組的匯入方式

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)