程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python零基礎入門-11 標准庫簡介 —— 第二部分

編輯:Python

11. 標准庫簡介 —— 第二部分

11.1. 格式化輸出

reprlib 模塊提供了一個定制化版本的 repr() 函數,用於縮略顯示大型或深層嵌套的容器對象

pprint 模塊提供了更加復雜的打印控制,其輸出的內置對象和用戶自定義對象能夠被解釋器直接讀取。當輸出結果過長而需要折行時,“美化輸出機制”會添加換行符和縮進,以更清楚地展示數據結構。

textwrap 模塊能夠格式化文本段落,以適應給定的屏幕寬度。

locale 模塊處理與特定地域文化相關的數據格式。locale 模塊的 format 函數包含一個 grouping 屬性,可直接將數字格式化為帶有組分隔符的樣式。

11.2. 模板

string 模塊包含一個通用的 Template 類,具有適用於最終用戶的簡化語法。它允許用戶在不更改應用邏輯的情況下定制自己的應用。

11.3. 使用二進制數據記錄格式

11.4. 多線程

線程是一種對於非順序依賴的多個任務進行解耦的技術。多線程可以提高應用的響應效率,當接收用戶輸入的同時,保持其他任務在後台運行。一個有關的應用場景是,將 I/O 和計算運行在兩個並行的線程中。

以下代碼展示了高階的 threading 模塊如何在後台運行任務,且不影響主程序的繼續運行:

import threading, zipfile
class AsyncZip(threading.Thread):
def __init__(self, infile, outfile):
threading.Thread.__init__(self)
self.infile = infile
self.outfile = outfile
def run(self):
f = zipfile.ZipFile(self.outfile, 'w', zipfile.ZIP_DEFLATED)
f.write(self.infile)
f.close()
print('Finished background zip of:', self.infile)
background = AsyncZip('mydata.txt', 'myarchive.zip')
background.start()
print('The main program continues to run in foreground.')
background.join() # Wait for the background task to finish
print('Main program waited until background was done.')

11.5. 日志記錄

logging 模塊提供功能齊全且靈活的日志記錄系統。在最簡單的情況下,日志消息被發送到文件或 sys.stderr

import logging
logging.debug('Debugging information')
logging.info('Informational message')
logging.warning('Warning:config file %s not found', 'server.conf')
logging.error('Error occurred')
logging.critical('Critical error -- shutting down')

這會產生以下輸出:

WARNING:root:Warning:config file server.conf not found
ERROR:root:Error occurred
CRITICAL:root:Critical error -- shutting down

默認情況下,informational 和 debugging 消息被壓制,輸出會發送到標准錯誤流。其他輸出選項包括將消息轉發到電子郵件,數據報,套接字或 HTTP 服務器。新的過濾器可以根據消息優先級選擇不同的路由方式:DEBUGINFOWARNINGERROR,和 CRITICAL

日志系統可以直接從 Python 配置,也可以從用戶配置文件加載,以便自定義日志記錄而無需更改應用程序。

11.6. 弱引用

weakref 模塊

11.7. 用於操作列表的工具

array 模塊提供了一種 array() 對象,它類似於列表,但只能存儲類型一致的數據且存儲密集更高。 下面的例子演示了一個以兩個字節為存儲單元的無符號二進制數值的數組 (類型碼為 "H"),而對於普通列表來說,每個條目存儲為標准 Python 的 int 對象通常要占用16 個字節:

>>> from array import array
>>> a = array('H', [4000, 10, 700, 22222])
>>> sum(a)
26932
>>> a[1:3]
array('H', [10, 700])

collections 模塊提供了一種 deque()對象,它類似於列表,但從左端添加和彈出的速度較快,而在中間查找的速度較慢。 此種對象適用於實現隊列和廣度優先樹搜索:

>>> from collections import deque
>>> d = deque(["task1", "task2", "task3"])
>>> d.append("task4")
>>> print("Handling", d.popleft())
Handling task1
unsearched = deque([starting_node])
def breadth_first_search(unsearched):
node = unsearched.popleft()
for m in gen_moves(node):
if is_goal(m):
return m
unsearched.append(m)

在替代的列表實現以外,標准庫也提供了其他工具,例如 bisect 模塊具有用於操作有序列表的函數:

>>> import bisect
>>> scores = [(100, 'perl'), (200, 'tcl'), (400, 'lua'), (500, 'python')]
>>> bisect.insort(scores, (300, 'ruby'))
>>> scores
[(100, 'perl'), (200, 'tcl'), (300, 'ruby'), (400, 'lua'), (500, 'python')]

heapq 模塊提供了基於常規列表來實現堆的函數。 最小值的條目總是保持在位置零。 這對於需要重復訪問最小元素而不希望運行完整列表排序的應用來說非常有用:

>>> from heapq import heapify, heappop, heappush
>>> data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
>>> heapify(data) # rearrange the list into heap order
>>> heappush(data, -5) # add a new entry
>>> [heappop(data) for i in range(3)] # fetch the three smallest entries
[-5, 0, 1]

11.8. 十進制浮點運算

decimal 模塊提供了一種 Decimal 數據類型用於十進制浮點運算。 相比內置的 float 二進制浮點實現,該類特別適用於

  • 財務應用和其他需要精確十進制表示的用途,

  • 控制精度,

  • 控制四捨五入以滿足法律或監管要求,

  • 跟蹤有效小數位,

  • 用戶期望結果與手工完成的計算相匹配的應用程序。

例如,對70美分話費計算5%稅,使用十進制浮點和二進制浮點數計算,會產生的不同結果。如果結果四捨五入到最接近的分數差異會明顯:

>>> from decimal import *
>>> round(Decimal('0.70') * Decimal('1.05'), 2)
Decimal('0.74')
>>> round(.70 * 1.05, 2)
0.73

Decimal 表示的結果會保留尾部的零,並根據具有兩個有效位的被乘數自動推出四個有效位。 Decimal 可以模擬手工運算來避免當二進制浮點數無法精確表示十進制數時會導致的問題。

精確表示特性使得 Decimal 類能夠執行對於二進制浮點數來說不適用的模運算和相等性檢測:

>>> Decimal('1.00') % Decimal('.10')
Decimal('0.00')
>>> 1.00 % 0.10
0.09999999999999995
>>> sum([Decimal('0.1')]*10) == Decimal('1.0')
True
>>> sum([0.1]*10) == 1.0
False

decimal 模塊提供了運算所需要的足夠精度:

>>> getcontext().prec = 36
>>> Decimal(1) / Decimal(7)
Decimal('0.142857142857142857142857142857142857')

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved