1. 程式人生 > >Python程式設計師面試常用基礎問題解析

Python程式設計師面試常用基礎問題解析

1. 什麼是Python?

Python是一種程式語言,它有物件、模組、執行緒、異常處理和自動記憶體管理。可以加入與其他語言的對比。下面是回答這一問題的幾個關鍵點:
a. Python是一種解釋型語言,python程式碼在執行之前不需要編譯。
b. Python是動態型別語言,在宣告變數時,不需要說明變數的型別。
c. Python適合面向物件的程式設計,因為它支援通過組合與繼承的方式定義類。
d. 在Python語言中,函式是第一類物件。
e. Python程式碼編寫快,但是執行速度比編譯語言通常要慢。
f. Python用途廣泛,常被用作“膠水語言”,可幫助其他語言和元件改善執行狀況。
g. 使用Python,程式設計師可以專注於演算法和資料結構的設計,而不用處理底層的細節。

2. 什麼是Python裝飾器?
裝飾器的本質也是一種函式。他可以在不改變函式原有功能的前提下,為其增加其他的功能。

3. 什麼是Python的名稱空間?
在Python中,所有的名字都存在於一個空間中,它們在該空間中存在和被操作——這就是名稱空間。它就好像一個盒子,每一個變數名字都對應裝著一個物件。當查詢變數的時候,會從該盒子裡面尋找相應的物件。

4. Lambda函式是什麼?
這是一個常被用於程式碼中的單個表示式的匿名函式。

5. args,kwargs?引數是什麼?
如果我們不確定要往函式中傳入多少個引數,或者我們想往函式中以列表和元組的形式傳引數時,那就使要用
args;如果我們不知道要往函式中傳入多少個關鍵詞引數,或者想傳入字典的值作為關鍵詞引數時,那就要使用

kwargs。

6. unittest是什麼?
在Python中,unittest是Python中的單元測試框架。它擁有支援共享搭建、自動測試、在測試中暫停程式碼、將不同測試迭代成一組,等等的功能。

7. 構造器是什麼?
構造器是實現迭代器的一種機制。它功能的實現依賴於yield表示式,除此之外它跟普通的函式沒有兩樣。

8. 負索引是什麼?
Python中的序列索引可以是正也可以是負。如果是正索引,0是序列中的第一個索引,1是第二個索引。如果是負索引,(-1)是最後一個索引而(-2)是倒數第二個索引。

9. Python如何實現單例模式?其他23種設計模式python如何實現?
單例模式主要有四種方法:new

、共享屬性、裝飾器、import。
其他23種設計模式可基本分為建立型、結構型和行為型模式。
建立模式,提供例項化的方法,為適合的狀況提供相應的物件建立方法。
結構化模式,通常用來處理實體之間的關係,使得這些實體能夠更好地協同工作。
行為模式,用於在不同的實體建進行通訊,為實體之間的通訊提供更容易,更靈活的通訊方法。
各模式的實現可根據其特點編寫程式碼(限於篇幅,此處不做示例)

10. 如何遍歷一個內部未知的資料夾?
常用的有以下這幾種辦法:os.path.walk(),os.walk(),listdir

11. mysql資料庫如何分割槽、分表?
分表可以通過三種方式:mysql叢集、自定義規則和merge儲存引擎。
分割槽有四類:
RANGE 分割槽:基於屬於一個給定連續區間的列值,把多行分配給分割槽。
LIST 分割槽:類似於按RANGE分割槽,區別在於LIST分割槽是基於列值匹配一個離散值集合中的某個值來進行選擇。
HASH分割槽:基於使用者定義的表示式的返回值來進行選擇的分割槽,該表示式使用將要插入到表中的這些行的列值進行計算。這個函式可以包含MySQL 中有效的、產生非負整數值的任何表示式。
KEY 分割槽:類似於按HASH分割槽,區別在於KEY分割槽只支援計算一列或多列,且MySQL 伺服器提供其自身的雜湊函式。必須有一列或多列包含整數值

12. 如何理解MVC/MTV框架?
MVC就是把Web應用分為模型(M),控制器(C)和檢視(V)三層,他們之間以一種外掛式的、鬆耦合的方式連線在一起。MTV模式本質上和MVC是一樣的,也是為了各元件間保持鬆耦合關係,只是定義上有些許不同。

13. 陣列和元組之間的區別?
陣列在python中叫作列表。列表可以修改,而元組不可以修改,如果元組中僅有一個元素,則要在元素後加上逗號。元組和列表的查詢方式一樣。元組只可讀不可修改,如果程式中的資料不允許修改可用元組。

14. _new_和_init_的區別?
__init__是當例項物件建立完成後被呼叫的,然後設定物件屬性的一些初始值。
__new__是在例項建立之前被呼叫的,因為它的任務就是建立例項然後返回該例項,是個靜態方法。
也就是,__new__在__init__之前被呼叫,__new__的返回值(例項)將傳遞給__init__方法的第一個引數,然後__init__給這個例項設定一些引數。

15. Python中單下劃線和雙下劃綫的區別?
“單下劃線” 開始的成員變數叫做保護變數,意思是隻有類物件和子類物件自己能訪問到這些變數;
“雙下劃線” 開始的是私有成員,意思是隻有類物件自己能訪問,連子類物件也不能訪問到這個資料

16. 淺拷貝與深拷貝的區別是?
在python中,物件賦值實際上是物件的引用。淺拷貝,沒有拷貝子物件,所以原始資料改變,子物件會改變,而深拷貝,包含物件裡面的自物件的拷貝,所以原始物件的改變不會造成深拷貝里任何子元素的改變。

17. 多程序與多執行緒的區別?
a. 簡而言之,一個程式至少有一個程序,一個程序至少有一個執行緒。
b. 執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。
c. 另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。
d. 執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。
e. 從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

18. select和epoll的區別?
a. select實現需要自己不斷輪詢所有fd集合,直到裝置就緒,期間可能要睡眠和喚醒多次交替。而epoll其實也需要呼叫epoll_wait不斷輪詢就緒連結串列,期間也可能多次睡眠和喚醒交替,但是它是裝置就緒時,呼叫回撥函式,把就緒fd放入就緒連結串列中,並喚醒在epoll_wait中進入睡眠的程序。雖然都要睡眠和交替,但是select在“醒著”的時候要遍歷整個fd集合,而epoll在“醒著”的時候只要判斷一下就緒連結串列是否為空就行了,這節省了大量的CPU時間。
b. select每次呼叫都要把fd集合從使用者態往核心態拷貝一次,並且要把current往裝置等待佇列中掛一次,而epoll只要一次拷貝,而且把current往等待佇列上掛也只掛一次(在epoll_wait的開始,注意這裡的等待佇列並不是裝置等待佇列,只是一個epoll內部定義的等待佇列)。這也能節省不少的開銷。

19. TCP和UDP的區別?邊緣觸發和水平觸發的區別?
a. 基本區別:
基於連線與無連線
TCP要求系統資源較多,UDP較少;
UDP程式結構較簡單
流模式(TCP)與資料報模式(UDP);
TCP保證資料正確性,UDP可能丟包
TCP保證資料順序,UDP不保證

b. 程式設計中的區別
socket()的引數不同
UDP Server不需要呼叫listen和accept
UDP收發資料用sendto/recvfrom函式
TCP:地址資訊在connect/accept時確定
UDP:在sendto/recvfrom函式中每次均 需指定地址資訊
UDP:shutdown函式無效

20. HTTP連線:get和post的區別?
GET請求,請求的資料會附加在URL之後,以?分割URL和傳輸資料,多個引數用&連線。URL的編碼格式採用的是ASCII編碼,而不是uniclde,即是說所有的非ASCII字元都要編碼之後再傳輸。
POST請求:POST請求會把請求的資料放置在HTTP請求包的包體中。上面的item=bandsaw就是實際的傳輸資料。
因此,GET請求的資料會暴露在位址列中,而POST請求則不會。

21. ecb和cbc模式有什麼區別?
ECB:是一種基礎的加密方式,密文被分割成分組長度相等的塊(不足補齊),然後單獨一個個加密,一個個輸出組成密文。
CBC:是一種迴圈模式,前一個分組的密文和當前分組的明文異或操作後再加密,這樣做的目的是增強破解難度。ECB和CBC的加密結果是不一樣的,兩者的模式不同,而且CBC會在第一個密碼塊運算時加入一個初始化向量。

22. 對稱加密與非對稱加密的區別?
對稱加密,需要對加密和解密使用相同金鑰的加密演算法。由於其速度快,對稱性加密通常在訊息傳送方需要加密大量資料時使用。所以,對稱性加密也稱為金鑰加密。
而非對稱加密演算法需要兩個金鑰:公開金鑰和私有金鑰。公開金鑰與私有金鑰是一對,如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密;如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。

23. NoSQL和關係資料庫的區別?
a. SQL資料存在特定結構的表中;而NoSQL則更加靈活和可擴充套件,儲存方式可以省是JSON文件、雜湊表或者其他方式。
b. 在SQL中,必須定義好表和欄位結構後才能新增資料,例如定義表的主鍵(primary key),索引(index),觸發器(trigger),儲存過程(stored procedure)等。表結構可以在被定義之後更新,但是如果有比較大的結構變更的話就會變得比較複雜。在NoSQL中,資料可以在任何時候任何地方新增,不需要先定義表。
c. SQL中如果需要增加外部關聯資料的話,規範化做法是在原表中增加一個外來鍵,關聯外部資料表。而在NoSQL中除了這種規範化的外部資料表做法以外,我們還能用如下的非規範化方式把外部資料直接放到原資料集中,以提高查詢效率。缺點也比較明顯,更新稽核人資料的時候將會比較麻煩。
d. SQL中可以使用JOIN錶鏈接方式將多個關係資料表中的資料用一條簡單的查詢語句查詢出來。NoSQL暫未提供類似JOIN的查詢方式對多個數據集中的資料做查詢。所以大部分NoSQL使用非規範化的資料儲存方式儲存資料。
e. SQL中不允許刪除已經被使用的外部資料,而NoSQL中則沒有這種強耦合的概念,可以隨時刪除任何資料。
f. SQL中如果多張表資料需要同批次被更新,即如果其中一張表更新失敗的話其他表也不能更新成功。這種場景可以通過事務來控制,可以在所有命令完成後再統一提交事務。而NoSQL中沒有事務這個概念,每一個數據集的操作都是原子級的。
g. 在相同水平的系統設計的前提下,因為NoSQL中省略了JOIN查詢的消耗,故理論上效能上是優於SQL的。

24. os與sys模組的區別?
前者提供了一種方便的使用作業系統函式的方法。後者提供訪問由直譯器使用或維護的變數和與直譯器進行互動的函式。