原创 第40條 考慮協程來併發運行多個函數

Python可以使用線程運行多個函數,使得這些函數看上去好像是在同一時間得到執行。然而,線程有三個顯著的缺點: 爲了確保數據安全,我們必須使用特殊的工具來協調這些線程。便使得線程代碼變得難於擴展和維護; 線程需要佔用大量內存,每

原创 第38條 線程中使用Lock來防止數據競爭

Python在內置的threading模塊中提供了Lock類,該類相當於互斥鎖,可以保護各線程數據結構不被破壞。 案例:新建一個Counter類,統計傳感器採樣獲得的樣本數量。 ### 計數器 class Counter(obje

原创 第37條 線程執行阻塞式I/O,但不能用來做平行計算

標準的Python實現叫做CPython。CPython分兩步用來運行Python程序: 1.首先,將文本形式的源代碼解析並編譯成字節碼; 2.然後,用一種基於棧的解釋器運行這份字節碼。 執行Python程序時,字節碼解釋器必

原创 第31條 用描述符改寫需要複用的@property方法

上一講 https://blog.csdn.net/minemine999/article/details/104499251講到@property的用法,可以代替getter和setter方法。 Python內置的@proper

原创 第25條 用super初始化父類

在Python中初始化父類的方法,是在子類繼承的構造函數中調用父類的init方法。 class Person(object): def __init__(self,name,age): self.name

原创 第24條 以@classmethod形式的多態通用地構建對象

在Python中,不僅對象支持多態,類也支持多態。 多態,使得繼承體系中的多個類能夠以各自獨有的方式來實現某個方法。這些類,都滿足相同的接口或繼承自相同的抽象類,但卻有着各自不同的功能。 案例1:實現MapReduce流程,定義表

原创 第29條 用純屬性@property取代get和set方法

在Java等語言的屬性訪問和設置中,通常會在類的代碼中添加getter和setter方法,以實現屬性的設置與獲取。 class OldResistor(object): def __init__(self,ohms):

原创 第27條 多使用public屬性,少用private屬性

Python類中屬性的訪問權限分爲:public和private兩種,然後對於C++類來說有:public、protected和private三種類型。 class MyObject(object): def __init

原创 第20條 用None和文檔字符串來描述具有動態默認值的參數

有時候我們想採用一種非靜態的類型,來作爲關鍵字參數的默認值。 案例1:打印日誌消息的時候,要把相關事件的時間也標註在信息中。 import datetime from time import sleep def log(messa

原创 第18/19條 位置參數/關鍵字參數的應用

令函數接收可變的位置參數(*args),能夠讓代碼更加清晰。 案例1:定義log函數打印輸出信息,如果參數個數固定,那麼必須將參數打包成列表傳進去。 def log(message,values): if not valu

原创 第15條 閉包內使用外圍作用域的變量

Python的閉包:是一種定義在某個作用域D中的函數F,這種函數F引用了作用域D裏面的變量。 案例1:將values列表中的數字進行排序,同時位於group中的數字放在不屬於group中元素之前。 def sort_priorit

原创 第16條 考慮用生成器來改寫直接返回列表的函數

前面提到,對於數據量很大時,可以用生成器表達式代替列表推導,同樣,當一個函數返回列表且數據量很大時,應該考慮使用生成器。 案例1:獲取字符串中每個單詞的首字母 def index_words(text): result =

原创 第10條 enumerate 代替range & zip同時遍歷兩個迭代器

1.xrange代替range 一般情況下,需要產生一定範圍內的數字時,會使用range函數 L = 100 for i in range(L): print(i) 但是,當L很大時,range(L)會首先生成一個大列表