python學習筆記_13(標準庫)

2020-08-13 09:35:09

標準庫


1. 包、模組基本概念

  • 模組,一個模組就是一個py檔案,模組名和檔名一致

  • 包,爲了組織模組,可以分組爲包,包就是模組所在的目錄,python中如果需要把目錄當作包,需要在目錄下建立一個__init__.py的檔案,如果匯入包實際匯入的是次檔案。

  • __all__變數,定義了模組的共有介面,在編寫模組時設定__all__變數,使用import *匯入只會匯入all中定義的內容,否則預設匯入模組中所有不以下劃線開頭的全域性名稱

  • __name__,主程式中值是__main__,在匯入模組中值設定爲模組的名稱

2. sys模組

函數/變數 描述
argv 命令列參數,包括指令碼名稱
exit([arg]) 退出當前的程式,可以參數爲給定的返回值或錯誤資訊
modules 對映模組名稱到載入模組的字典
path 查詢模組所在的目錄的目錄列表
platform 平臺表示,類似sunos5或win32的平臺標識
stdin 標準輸入流-------一個類檔案(file-like)物件
stdou 標準輸出流-------一個類檔案(file-like)物件
stderr 標準錯誤流-------一個類檔案(file-like)物件

3. os模組

函數/變數 描述
environ 對環境變數進行對映
system(command) 在子shell中執行操作系統命令
sep 路徑分隔符
pathsep 分隔路徑的分隔符
linesep 行分隔符(’\n’, ‘\r’或’\r\n’)
urandom(n) 返回n位元組的加密強隨機數據

4. fileinput模組

函數 描述
input(files[, inplace[, bakup]]) 便於遍歷多個輸入流中的行
filename() 返回當前檔案的名稱
lineno() 返回當前(累計)的行數
filelineno() 放回當前檔案的行數
isfirstline() 檢測當前是否是檔案的第一行
isstdin() 檢測最後一行是否來自sys.stdin
nextfile() 關閉當前檔案,移動下一個檔案
close() 關閉序列
#!/bin/sh
# -*- coding: utf-8 -*-

import fileinput
import sys

for line in fileinput.input(inplace=True):
    line = line.rstrip()
    num = fileinput.filelineno()
    print '%-40s # %02d' % (line, num)
 

#儲存爲numberlines.py,執行python numberlines.py numberlines.py
#執行後程式檔案
#!/bin/sh                                # 01
# -*- coding: utf-8 -*-                  # 02
                                         # 03
import fileinput                         # 04
import sys                               # 05
                                         # 06
for line in fileinput.input(inplace=True): # 07
    line = line.rstrip()                 # 08
    num = fileinput.filelineno()         # 09
    print '%-40s # %02d' % (line, num)   # 10

5. 集合(set)

集合Set類位於sets模組中,在python 2.3中通過set型別的實現成爲了語言的一部分,意味不需要匯入直接建立集合

  • 集合是由序列構建的,主要用於檢查成員資格,因此副本是被忽略的,集閤中的元素都是唯一的

  • 集合元素的順序是隨意的

    >>> set(range(10))
    set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> set([0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
    set([0, 1, 2, 3, 4])
    >>> set(['fee', 'fie', 'foe'])
    set(['foe', 'fee', 'fie'])
  • 集合操作,除了檢查成員資格,還可以使用標準的集合操作,比如並集和交集,可以使用方法,也可以使用對整數進行位元運算時使用的操作

    >>> a = set([1, 2, 3])
    >>> b = set([2, 3, 4])
    # 1. 並集
    >>> a.union(b)
    set([1, 2, 3, 4])
    >>> a | b
    set([1, 2, 3, 4])
    # 2. 交集
    >>> a.intersection(b)
    set([2, 3])
    >>> c = a & b
    >>> c
    set([2, 3])
    # 3. 判斷子集
    >>> c.issubset(a)
    True
    >>> c <= a
    True
    # 4. 判斷超集
    >>> c.issuperset(a)
    False
    >>> c >= a
    False
    # 5. 補集
    >>> a.difference(b)
    set([1])
    >>> a - b
    set([1])
    # 6. 真補集
    >>> a.symmetric_difference(b)
    set([1, 4])
    >>> a ^ b
    set([1, 4])
  • 集合是可變的,所有集合不能用做字典中的鍵,另外集合本身只能包含不可變的元素,所以集合不能包含其他集合。

  • frozenset,不可變集合,可以作爲集合的元素

    >>> a = set()
    >>> a
    set([])
    >>> b=set()
    >>> a.add(b)
    
    Traceback (most recent call last):
      File "<pyshell#40>", line 1, in <module>
        a.add(b)
    TypeError: unhashable type: 'set'
    
    >>> a.add(frozenset(b))
    >>> a
    set([frozenset([])]) 

6. 堆(heap)

  • 優先佇列的一種,使用優先佇列能夠以任意順序增加物件,並且能在任何時間找到最小物件

  • python中沒有獨立的堆型別,只有一個包含一些堆操作的函數的模組,這個模組是heapq(q即queue的縮寫),包含以下函數

    堆屬性(heap property)位於i位置上的元素總比i//2位置處的元素大,反過來說就是位置i處的元素總比2*i和2*i+1位置處的元素小,這是底層堆演算法的基礎

    函數 描述
    heappush(heap, x) 將x入堆
    heappop(heap) 將x中的最小元素彈出
    heapify(heap, x) 將heap屬性應用到任意一個列表
    nlargest(n, iter) 返回iter中第n大的元素
    nsmallest(n, iter) 返回iter中第n小的元素
    >>> from heapq import *
    >>> from random import shuffle
    >>> data = range(10)
    >>> shuffle(data)
    >>> data
    [9, 8, 1, 4, 3, 0, 6, 7, 5, 2]
    >>> heap = []
    # 1. heappush
    >>> for n in data:
    	heappush(heap, n)
    
    	
    >>> heap
    [0, 2, 1, 5, 3, 8, 6, 9, 7, 4]
    >>> heappush(heap, 0.5)
    >>> heap
    [0, 0.5, 1, 5, 2, 8, 6, 9, 7, 4, 3]
    # 2. heappop,彈出最小的元素,一般來說是在索引0處,並確保剩餘元素中最小的佔據這個位置
    >>> heappop(heap)
    0
    >>> heap
    [0.5, 2, 1, 5, 3, 8, 6, 9, 7, 4]
    >>> heappop(heap)
    0.5
    >>> heappop(heap)
    1
    >>> heap
    [2, 3, 4, 5, 7, 8, 6, 9]
    # 3. heapify,使用任意列表做爲參數,並且通過儘可能少的移位轉換爲合法的堆
    >>> heap = [5, 8, 0, 3, 6, 7, 9, 1, 4, 2]
    >>> heapify(heap)
    >>> heap
    [0, 1, 5, 3, 2, 7, 9, 8, 4, 6]
    # 4. heapreplace,彈出最小元素,並將新元素推入
    >>> heapreplace(heap, 0.5)
    0
    >>> heap
    [0.5, 1, 5, 3, 2, 7, 9, 8, 4, 6]
    # 5. nlargest和nsmallest,分別尋找任何可迭代物件iter中第n大或n小的元素
    >>> heap = [3, 2, 5, 9, 0 ,3, 1, 4]
    >>> nlargest(3, heap)
    [9, 5, 4]
    >>> nlargest(2, heap)
    [9, 5]
    >>> nlargest(1, heap)
    [9]
    >>> nsmallest(2, heap)
    [0, 1]

7. 雙端佇列

  • 雙端佇列(double-ended queue或稱deque),在需要按元素增加的順序來移除元素時非常有用

    python 2.4中增加了collections模組,包括deque型別

    python 2.5中的collections模組只包括deque和defaultdict型別

  • 雙端佇列通過可迭代物件建立,而且有些非常有用的方法,如下範例

    >>> from collections import deque
    >>> q = deque(range(5))
    >>> q.append(5)
    >>> q
    deque([0, 1, 2, 3, 4, 5])
    >>> q.appendleft(6)
    >>> q
    deque([6, 0, 1, 2, 3, 4, 5])
    >>> q.pop()
    5
    >>> q.popleft()
    6
    >>> q
    deque([0, 1, 2, 3, 4])
    >>> q.rotate(3)
    >>> q
    deque([2, 3, 4, 0, 1])
    >>> q.rotate(-1)
    >>> q
    deque([3, 4, 0, 1, 2])
    >>>