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. 判斷運算的結果是否達到某個範圍等,根據設計的目的來選擇

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章