Python學習摘要201802

  • 【基礎】變量設計機制
    【我的理解】python的變量與C++語言中的指針相似,是指向內存數據的一個引用。變量分爲不可變變量string/int/float/tuple和可變變量list/dict。
    對於不可變量若是須要建立的對象的內容(value值)相同,則引用都指向同一個對象,不建立新的內存空間。
    理論上由於定義了值是不可變的。因此若是你們都同樣的值,那就指向同一分內存空間好了。顯然這麼節省內存,避免冗餘。
    對於可變量只要建立對象那就是本質是new一個新的內存空間,可是好處是可以修改。即修改對象值不會新開闢對象而是就是在原來內存空間改。
    變量無類型,對象有類型 使用一個變量以前不須要提早聲明,只須要在使用的時候賦值。

嚴格地說明,只有放在內存空間中對象纔有類型,而變量是沒有類型的。一個變量只能對應只一個對象,一個對象能夠對應多個變量。html

  • 【基礎】深度拷貝實現機制
    【我的理解】深度拷貝是針對可變變量進行內存複製的。機制不清楚。
    淺度拷貝:copy.copy,會建立的一個新的對象,若是是list對象,對於list對象的元素淺拷貝就只會使用原始元素的引用(內存地址)。
    深度拷貝:copy.deepcopy,會建立一個新的對象。若是是list對象,對於list對象的元素,深拷貝都會從新生成一份,而不是簡單的使用原始元素的引用。
    對於不能夠變的變量對象,不能拷貝,淺度拷貝和深度拷貝都是同樣的。python

  • new() 與 init()的區別
    【我的理解】init()能夠認爲是__new__()的包裝的外殼,在定義類中必需要定義這個方法,能夠傳入類對象的屬性值。__new__()類對象申請內存空間的方法?
    __new__是類方法,參數中帶有cls,表明實例化的類。繼承自object的新式類纔有__new__。
    __new__必需要有返回值,返回實例化出來的實例,這點在本身實現__new__時要特別注意,能夠return父類__new__出來的實例,或者直接是object的__new__出來的實例。
    __init__有一個參數self,就是這個__new__返回的實例,__init__在__new__的基礎上能夠完成一些其它初始化的動做,__init__不須要返回值正則表達式

實例化一個類時,__new__是首先被調用的,而後纔是__init__調用。
__new__是建立類實例的方法,能夠建立單例模式的實例對象生成。__init__是實例建立後的方法。算法

  • 列表推導和生成器的區別及優劣
    【我的理解】列表推導經過較短的代碼(一行)快速生成一個相應的列表變量。生成器是指生成可迭代對象,可迭代對象動態經過next方法生成列表元素。列表推導在內存中生成大量的數據,生成器是動態根據算法記念性推導算出。
    列表推導的方法是直接在內存中生成對象的數據,這樣須要佔用內存空間。
    在python中,既能夠循環又能夠計算的對象成爲生成器,生成器實現了迭代器協議,可迭代對象。
g = (i for i in range(10**100))#生成器表達式
l = [i for i in range(10**100)]#列表生成式

print g.__next__()#更省內存,須要一個取一個
print l.__next__()#須要在內存中建立1行10**100列的序列

另外,使用了yield替代return的函數稱之爲生成器函數。生成器函數和其餘函數的執行流程不同,其餘函數是順序執行,遇到return語句或者最後一行函數語句就結束。在調用生成器運行過程當中,每次遇到yield時函數會暫停並保存當前全部的運行信息,返回yield值。並在下一次執行next方法時,從當前位置繼續運行。多線程

  • 編碼和解碼
    【我的理解】編碼和解碼的問題我認爲是一個翻譯的問題。unicode是計算機的標準語言,其餘的utf-8或者gbk都是不一樣體系的語言,編碼的過程是把unicode翻譯到對應體系的語言,解碼的過程是把不一樣的體系語言翻譯成unicode的過程。
    參見之前寫的博文基於Python的數據分析(2):字符串編碼函數

  • 裝飾器、wraps的使用、單例模式
    【我的理解】裝飾器是函數或者類的對象的外殼,能夠在指定被裝飾的函數調用先後加入特定的功能。Python裝飾器的做用是提升代碼的簡潔,下降代碼的耦合性,將代碼要執行的業務邏輯和公共功能進行分離,業務邏輯經過具體的函數來實現,公共功能(例如日誌記錄,權限認證,輸入檢查等等)由裝飾器負責,代碼耦合性下降的同時複用成都也大大提升。
    在 Python 中,使用關鍵字 def 和一個函數名以及一個可選的參數列表來定義函數。函數使用 return 關鍵字來返回值。Python 容許建立內嵌函數。便可以在函數內部聲明函數,而且全部的做用域和生命週期規則仍然適用。裝飾器其實就是一個以函數做爲參數並返回一個替換函數的可執行函數。
    注意:1.@符號是裝飾器的語法糖,在定義函數的時候使用,避免再一次賦值操做。2.args 能夠表示在調用函數時從迭代器中取出位置參數, 也能夠表示在定義函數時接收額外的位置參數。3. kwargs 來表示全部未捕獲的關鍵字參數將會被存儲在字典 kwargs。
    除了函數裝飾器,還有一個類型叫作類裝飾器。
    類裝飾器*
    具備靈活度打、高內聚、封裝性等優勢。使用類裝飾器以來內部的__call__方法,當使用語法糖@附加到函數上時,就能夠調用此方法。注意帶參數和不帶參數的兩種類裝飾器的區別。編碼

#不帶參數的類裝飾器
class Check(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args,**kwargs):
        print("111111")
        self.func(*args,**kwargs)
        print("222222")

@Check
def param_check(request):
    print(request)

param_check('hello')
param_check('world')

#帶參數的類裝飾器
class Check(object):
    def __init__(self, name):
        self.name = name

    def __call__(self, func):
        print ("1111111111")

        def decorator(*args, **kwargs):
            print ("2222222222")
            return func(*args, **kwargs)
        return decorator

@Check('parm')
def param_check():
    print('Hello')

param_check()
param_check()

Python裝飾器(decorator)在實現的時候,被裝飾後的函數其實已是另一個函數了(函數名等函數屬性會發生改變),爲了避免影響,Python的functools包中提供了一個叫wraps的decorator來消除這樣的反作用。寫一個decorator的時候,最好在實現以前加上functools的wrap,它能保留原有函數的名稱和docstring。操作系統

裝飾器的單例模式:線程

def singleton(cls, *args, **kw):
    instance={}
    def _singleton():
        if cls not in instance:
            instance[cls]=cls(*args, **kw)
        return instance[cls]
    return _singleton

@singleton
class test_singleton(object):
    def __init__(self):
        self.num_sum=0
    def add(self):
        self.num_sum=100
  • 正則表達式
    【我的理解】從文本信息中匹配或者抽取制定規則的信息。翻譯

  • 垃圾回收
    【我的理解】內存回收。
    python的內存回收機制是引用計數策略。對Python語言來說,對象的類型和內存都是在運行時肯定的。這也是爲何咱們稱Python語言爲動態類型的緣由(這裏咱們把動態類型能夠簡單的歸結爲對變量內存地址的分配是在運行時自動判斷變量類型並對變量進行賦值)。
    解釋器負責跟蹤對象的引用計數,垃圾收集器負責釋放內存。
    經過銷燬對象的引用,使引用計數減小至 0。
    假設 x = 3,如下狀況會使 3 這個整型對象的引用計數減小:

  1. 函數運行結束,全部局部變量都被銷燬,對象的引用計數也就隨之減小。例如 foo(x) 運行結束,x 被銷燬;
  2. 當變量被賦值給另外一個對象時,原對象的引用計數也會減小。例如 x = 4,這時候 3 這個對象的引用計數就減 1 了;
  3. 使用 del 刪除一個變量也會致使對象引用減小。例如 del x;
  4. 對象從集合對象中移除。例如 lst.remove(x);包含對象的集合對象被銷燬。例如 del lst。

    Python的內存機制以金字塔行,-1,-2層主要有操做系統進行操做;第0層是C中的malloc,free等內存分配和釋放函數進行操做;第1層和第2層是內存池,有Python的接口函數,PyMem_Malloc函數實現,當對象小於256K時有該層直接分配內存;第3層是最上層,也就是咱們對Python對象的直接操做。
    垃圾回收時,Python不能進行其它的任務。頻繁的垃圾回收將大大下降Python的工做效率。若是內存中的對象很少,就沒有必要總啓動垃圾回收。因此,Python只會在特定條件下,自動啓動垃圾回收。當Python運行時,會記錄其中分配對象(object allocation)和取消分配對象(object deallocation)的次數。當二者的差值高於某個閾值時,垃圾回收纔會啓動。能夠手動啓動gc.collect.
    當內存中有再也不使用的部分時,垃圾收集器就會把他們清理掉。它會去檢查那些引用計數爲0的對象,而後清除其在內存的空間。固然除了引用計數爲0的會被清除,還有一種狀況也會被垃圾收集器清掉:當兩個對象相互引用時,他們自己其餘的引用已經爲0了。垃圾回收機制還有一個循環垃圾回收器, 經過消除引用換的方式釋放循環引用對象(a引用b, b引用a, 致使其引用計數永遠不爲0)。

  • 多進程和多線程

  • 協程

相關文章
相關標籤/搜索