1. 程式人生 > >2018最常見的Python面試題(技術題)---------------------第三波福利

2018最常見的Python面試題(技術題)---------------------第三波福利

1.請說一下你對迭代器和生成器的區別?

(1)迭代器是一個更抽象的概念,任何物件,如果它的類有 next 方法和 iter
方法返回自己本身。對於 string、list、dict、tuple 等這類容器物件,使用 for 迴圈遍歷
是很方便的。在後臺 for 語句對容器物件呼叫 iter()函式,iter()是 python 的內建函式。
iter()會返回一個定義了 next()方法的迭代器物件,它在容器中逐個訪問容器內元素,
next()也是 python 的內建函式。在沒有後續元素時,next()會丟擲一個 StopIteration 異

(2)生成器(Generator)是建立迭代器的簡單而強大的工具。它們寫起來就像是正規
的函式,只是在需要返回資料的時候使用 yield 語句。每次 next()被呼叫時,生成器會返
回它脫離的位置(它記憶語句最後一次執行的位置和所有的資料值)
區別:生成器能做到迭代器能做的所有事,而且因為自動建立了__iter__()和 next()方
法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器表示式取代列表解析可以同時
節省記憶體。除了建立和儲存程式狀態的自動方法,當發生器終結時,還會自動丟擲
StopIteration 異常

2.什麼是執行緒安全?

執行緒安全是在多執行緒的環境下,能夠保證多個執行緒同時執行時程式依舊執行正確, 而且
要保證對於共享的資料可以由多個執行緒存取,但是同一時刻只能有一個執行緒進行存取。多線
程環境下解決資源競爭問題的辦法是加鎖來保證存取操作的唯一性。

3.Python 中陣列有哪些型別?字典可以是有序的嗎??

List Tuple Dictionary
from collections import OrderedDict
dic=OrderedDict()#宣告有序字典

4.python 中 yield 的用法?

yield 簡單說來就是一個生成器,這樣函式它記住上次返 簡單說來就是一個生成
器,這樣函式它記住上次返 簡單說來就是一個生成器,這樣函式它記住上次返 簡單說來就
是一個生成器,這樣函式它記住上次返 回時在函式體中的位置。對生成器第 二次(或 n 次)
呼叫跳轉至該函 次)呼叫跳轉至該函 數。

5.談談你對 GIL 鎖對 python 多執行緒的影響?

GIL 的全稱是 Global Interpreter Lock(全域性直譯器鎖),來源是 python 設計之初的考
慮,為了資料安全所做的決定。每個 CPU 在同一時間只能執行一個執行緒(在單核 CPU 下的多
執行緒其實都只是併發,不是並行,併發和並行從巨集觀上來講都是同時處理多路請求的概念。
但併發和並行又有區別,並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多
個事件在同一時間間隔內發生。)
在 Python 多執行緒下,每個執行緒的執行方式:
1、獲取 GIL
2、執行程式碼直到 sleep 或者是 python 虛擬機器將其掛起。
3、釋放 GIL
可見,某個執行緒想要執行,必須先拿到 GIL,我們可以把 GIL 看作是“通行證”,並且
在一個 python 程序中,GIL 只有一個。拿不到通行證的執行緒,就不允許進入 CPU 執行。
在Python2.x裡, GIL的釋放邏輯是當前執行緒遇見IO操作或者ticks計數達到100(ticks
可以看作是 Python 自身的一個計數器,專門做用於 GIL,每次釋放後歸零,這個計數可以
通過 sys.setcheckinterval 來調整),進行釋放。而每次釋放 GIL 鎖,執行緒進行鎖競爭、
切換執行緒,會消耗資源。並且由於 GIL 鎖存在,python 裡一個程序永遠只能同時執行一個
執行緒(拿到 GIL 的執行緒才能執行)。
IO 密集型程式碼(檔案處理、網路爬蟲等),多執行緒能夠有效提升效率(單執行緒下有 IO 操
作會進行 IO 等待,造成不必要的時間浪費,而開啟多執行緒能線上程 A 等待時,自動切換到
執行緒 B,可以不浪費 CPU 的資源,從而能提升程式執行效率),所以多執行緒對 IO 密集型程式碼
比較友好。

6. Python 常用的設計模式有哪些? 1 建立型模式

前面講過,社會化的分工越來越細,自然在軟體設計方面也是如此,因此物件的建立和
物件的使用分開也就成為了必然趨勢。因為物件的建立會消耗掉系統的很多資源,所以單獨
對物件的建立進行研究,從而能夠高效地建立物件就是建立型模式要探討的問題。這裡有 6
個具體的建立型模式可供研究,它們分別是:
簡單工廠模式(Simple Factory);
工廠方法模式(Factory Method);
抽象工廠模式(Abstract Factory);
建立者模式(Builder);
原型模式(Prototype);
單例模式(Singleton)。
說明:嚴格來說,簡單工廠模式不是 GoF 總結出來的 23 種設計模式之一。
2 結構型模式
在解決了物件的建立問題之後,物件的組成以及物件之間的依賴關係就成了開發人員關
注的焦點,因為如何設計物件的結構、繼承和依賴關係會影響到後續程式的維護性、程式碼的
健壯性、耦合性等。物件結構的設計很容易體現出設計人員水平的高低,這裡有 7 個具體的
結構型模式可供研究,它們分別是:
外觀模式(Facade);
介面卡模式(Adapter);
代理模式(Proxy);
裝飾模式(Decorator);
橋模式(Bridge);
組合模式(Composite);
享元模式(Flyweight)
3 行為型模式
在物件的結構和物件的建立問題都解決了之後,就剩下物件的行為問題了,如果物件的
行為設計的好,那麼物件的行為就會更清晰,它們之間的協作效率就會提高,這裡有 11 個
具體的行為型模式可供研究,它們分別是:
模板方法模式(Template Method);
觀察者模式(Observer);
狀態模式(State);
策略模式(Strategy);
職責鏈模式(Chain of Responsibility);
命令模式(Command);
訪問者模式(Visitor);
調停者模式(Mediator);
備忘錄模式(Memento);
迭代器模式(Iterator);
直譯器模式(Interpreter)。

7.解釋一下什麼是閉包?

內部函式可以使用外部函式變數的行為,就叫閉包。

8.如何用 Python 來進行查詢和替換一個文字字串?

可以使用 re 模組中的 sub()函式或者 subn()函式來進行查詢和替換,
格式: sub(replacement, string[,count=0])(replacement 是被替換成的文字, string
是需要被替換的文字,count 是一個可選引數,指最大被替換的數量)

9.遞迴函式停止的條件

遞迴的終止條件一般定義在遞迴函式內部,在遞迴呼叫前要做一個條件判斷,根據判斷
的結果選擇是繼續呼叫自身,還是 return;返回終止遞迴。
終止的條件:1.判斷遞迴的次數是否達到某一限定值
2. 判斷運算的結果是否達到某個範圍等,根據設計的目的來選擇