【轉】Python高級知識點總結

1、可迭代對象、迭代器對象和生成器數據庫

  像list, tuple等這些序列是可使用for...in ...語句來進行遍歷輸出的。這是爲何呢?這就須要知道可迭代對象(Iterable)、迭代器對象(Iterator)和生成器對象(Generator)了。編程

  1.什麼可迭代對象?多線程

    把能夠經過for...in...這類語句迭代讀取一條數據供咱們使用的對象。函數

  2. 可迭代對象的本質?spa

    可迭代對象經過__iter__方法向咱們提供一個迭代器,咱們在迭代一個可迭代對象的時候,實際上就是先獲取該對象提供的一個迭代器,而後經過這個迭代器來依次獲取對象中的每個數據。線程

    也就是說可迭代對象必需要有__iter__()方法3d

  3.iter()函數與next()函數的做用是什麼?code

    經過iter()函數獲取可迭代對象的迭代器。協程

    而後咱們能夠對獲取到的迭代器不斷使用next()函數來獲取下一條數據。當咱們已經迭代完最後一個數據以後,再次調用next()函數會拋出StopIteration異常對象

    來告訴咱們全部數據都已迭代完成,不用再執行next()函數了。

  4.什麼是迭代器對象?

    一個實現了__iter__方法和__next__方法的對象,就是迭代器。

  5. 什麼是生成器?

    簡單來講:只要在def中有yield關鍵字的 就稱爲生成器

  6.yield的做用是什麼?

    yield關鍵字有兩點做用:

      (1).保存當前運行狀態(斷點),而後暫停執行,即將生成器(函數)掛起

      (2).將yield關鍵字後面表達式的值做爲返回值返回,此時能夠理解爲起到了return的做用

    Python2中的原生協程就是使用yield關鍵字,但在Python3中是使用了yield from。

  7.若是啓動生成器?

    send():除了能喚醒生成器外,還能夠給生成器傳遞值;

    next():單純的獲取生成器中的一個值。

 

2、GIL

  前言:瞭解Python的都知道,在Python中多線程並非真正意義上的多線程。那爲何在Python中多線程的威力沒有像其餘語言那樣大呢?

   1.GIL全稱是全局解釋器鎖,保證了同一時刻只有一個線程在執行。

   2.做用:在單核的狀況下實現多任務!這在當時很是厲害的技術。

   3.產生問題的緣由:一個CPU分配給一個進程,進程的線程使用GIL進行資源搶奪。在多核狀況下,會使其餘核空閒,CPU的利用率不高。

   4.解決方案:

    1). 使用其餘解釋器,如JPython(可是太慢了,很差!)。由於只有在CPython中才存在GIL。

    2). 使用其餘語言(C/Java)來寫多線程這部分代碼

    3). 使用多進程+協程的方式。(推薦的方式,很高效)!

  

3、淺拷貝VS深拷貝

  深拷貝(deepcopy):它是一種遞歸的方式拷貝某個對象,單獨造成一個新對象。這種方式很浪費資源。使用from some_moudle import xx 就是一種深拷貝的方式!

  淺拷貝(copy):它支複製一層信息,佔用的資源少!並且大部分的形式都是一淺拷貝的方式!

 

  深拷貝示意圖:

  

 

  淺拷貝示意圖:

    

      

  

4、面向對象總結:

  1.私有化

     (1).x:公有變量;

     (2)._x:單個前置下劃線,私有化方法或屬性,from some_module import *是不能導入的,只有類和對象能夠訪問;

   (3).__x:雙前置下劃線,避免與子類中的屬性命名衝突,外部沒法訪問,可是能夠經過特殊的方式(obj._類名__xx)訪問到

   (4).__x__:雙先後下劃線,用戶名字空間的魔法方法後屬性。最好不要用這種命名方式!

   (5).x_:單後置下劃線,用於避免與Python關鍵詞衝突!不要使用哦!

  2.封裝

    一個功能一個函數,把相關函數封裝成一個類對象。好處是代碼能夠複用,讓代碼更加清爽!

  3.繼承:

    多個子類擁有相同的功能,而後把相同的函數放到父類中,經過子類的方式繼承下來。好處是代碼複用。

  4.多態:

    (1).必需要有繼承;

    (2).不一樣對象調用同一個函數,會有不一樣的表現形式;

    (3).Python中的多態並非嚴謹的多態,由於沒有作類型檢查!

  5.類與實例對象之間的關係:  

    

  6.面向函數編程 VS 面向對象編程:

   面向函數編程:一個功能,一個函數。

   面向對象編程:把相關函數封裝成一個類對象。

5、模塊導入與路徑搜索

  1.動態導入:

    (1). import module;

    (2). __import__("some_module")

    這兩種方式是同樣的! 

  2.路徑搜索:

    在導入某個模塊時,會在sys.path()中搜索目標模塊。若是找到了,那麼就中止搜索,不然一直找到最後!

  3.從新加載模塊

    from imp import reload,reload函數的好處是當導入的某個模塊作了修改時,又不想經過關機來從新導入,而是進行熱更新,就能獲取到修改後的值!

 

6、類中方法總結

  1.魔法方法

    (1). __init__:用於初始化對象

    (2). __new__:用於建立對象

    (3).__call_:使對象變得可調用

    (4). __dict__:把類中的屬性組成一個字典,屬性名做爲key, 屬性值做爲value

    (5).__class__:用於查看對象是由哪一個類建立的

  2.super():

    當有多個類發生繼承關係時,Python內部會維護着一張繼承表(經過__mro__能夠查看)。super()在當前繼承表中找到本身的位置,而後執行下一個類的__init__方法。

 

7、上下文管理器(ContextManager)

  在不少時候,咱們都會看到with open(filename, 'w') as f:pass,這種操做文件的方式。這種操做的好處就是咱們不須要手動調用f.close()來關閉咱們打開的文件。這是爲何呢?

  任何一個上下文管理器對象均可以使用with關鍵字來操做。什麼是上下文管理器呢?

  只要實現了__enter__()和__exit__()方法的類就是上下文管理器!

  __enter__():返回資源對象。

  __exit__():在操做完成以後,進行清除工做。如關閉文件

  鏈接數據庫的上下文管理器:

  第一種方式:

複製代碼
 
 
複製代碼

  第二種方式:

  

複製代碼
 
 
複製代碼
相關文章
相關標籤/搜索