python程序員面試寶典:12個Python程序員面試必備問題與答案

@本文來源於公衆## 標題號:csdn2299,喜歡可以關注公衆號 程序員學府

1. 什麼是pickling和unpickling?

Pickle模塊讀入任何Python對象,將它們轉換成字符串,然後使用dump函數將其轉儲到一個文件中——這個過程叫做pickling。反之從存儲的字符串文件中提取原始Python對象的過程,叫做unpickling。

2. 什麼是Python的命名空間?

在Python中,所有的名字都存在於一個空間中,它們在該空間中存在和被操作——這就是命名空間。它就好像一個盒子,每一個變量名字都對應裝着一個對象。當查詢變量的時候,會從該盒子裏面尋找相應的對象。

3. args,kwargs?參數是什麼?

如果我們不確定要往函數中傳入多少個參數,或者我們想往函數中以列表和元組的形式傳參數時,那就使要用*args;如果我們不知道要往函數中傳入多少個關鍵詞參數,或者想傳入字典的值作爲關鍵詞參數時,那就要使用**kwargs。

4. 負索引是什麼?

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

5. Python是如何進行內存管理的?

Python的內存管理是由私有heap空間管理的。所有的Python對象和數據結構都在一個私有heap中。程序員沒有訪問該heap的權限,只有解釋器才能對它進行操作。爲Python的heap空間分配內存是由Python的內存管理模塊進行的,其核心API會提供一些訪問該模塊的方法供程序員使用。Python有自帶的垃圾回收系統,它回收並釋放沒有被使用的內存,讓它們能夠被其他程序使用。

6. 如何判斷單向鏈表中是否有環

首先遍歷鏈表,尋找是否有相同地址,藉此判斷鏈表中是否有環。如果程序進入死循環,則需要一塊空間來存儲指針,遍歷新指針時將其和儲存的舊指針比對,若有相同指針,則該鏈表有環,否則將這個新指針存下來後繼續往下讀取,直到遇見NULL,這說明這個鏈表無環。

7. mysql數據庫如何分區、分表?

分表可以通過三種方式:mysql集羣、自定義規則和merge存儲引擎。

分區有四類:

RANGE 分區:基於屬於一個給定連續區間的列值,把多行分配給分區。

LIST 分區:類似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值來進行選擇。

HASH分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數可以包含MySQL 中有效的、產生非負整數值的任何表達式。

KEY 分區:類似於按HASH分區,區別在於KEY分區只支持計算一列或多列,且MySQL 服務器提供其自身的哈希函數。必須有一列或多列包含整數值。

8. 如何對查詢命令進行優化?

a. 應儘量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索。

b. 應儘量避免在 where 子句中對字段進行 null 值判斷,避免使用!=或<>操作符,避免使用 or 連接條件,或在where子句中使用參數、對字段進行表達式或函數操作,否則會導致權標掃描

c. 不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。

d. 使用索引字段作爲條件時,如果該索引是複合索引,那麼必須使用到該索引中的第一個字段作爲條件時才能保證系統使用該索引,否則該索引將不會被使用。

e. 很多時候可考慮用 exists 代替 in

f. 儘量使用數字型字段

g. 儘可能的使用 varchar/nvarchar 代替 char/nchar

h. 任何地方都不要使用 select * from t ,用具體的字段列表代替“*”,不要返回用不到的任何字段。

i. 儘量使用表變量來代替臨時表。

j. 避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。

k. 儘量避免使用遊標,因爲遊標的效率較差。

l. 在所有的存儲過程和觸發器的開始處設置 SET NOCOUNT ON ,在結束時設置 SET NOCOUNT OFF

m. 儘量避免大事務操作,提高系統併發能力。

n. 儘量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。

9. 多進程與多線程的區別?

a. 簡而言之,一個程序至少有一個進程,一個進程至少有一個線程。

b. 線程的劃分尺度小於進程,使得多線程程序的併發性高。

c. 另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

d. 線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。

e. 從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

10. select和epoll的區別?

a. select實現需要自己不斷輪詢所有fd集合,直到設備就緒,期間可能要睡眠和喚醒多次交替。而epoll其實也需要調用epoll_wait不斷輪詢就緒鏈表,期間也可能多次睡眠和喚醒交替,但是它是設備就緒時,調用回調函數,把就緒fd放入就緒鏈表中,並喚醒在epoll_wait中進入睡眠的進程。雖然都要睡眠和交替,但是select在“醒着”的時候要遍歷整個fd集合,而epoll在“醒着”的時候只要判斷一下就緒鏈表是否爲空就行了,這節省了大量的CPU時間。

b. select每次調用都要把fd集合從用戶態往內核態拷貝一次,並且要把current往設備等待隊列中掛一次,而epoll只要一次拷貝,而且把current往等待隊列上掛也只掛一次(在epoll_wait的開始,注意這裏的等待隊列並不是設備等待隊列,只是一個epoll內部定義的等待隊列)。這也能節省不少的開銷。

11. 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函數無效

12. 下面的代碼能夠運行麼?請解釋?

例如:
在這裏插入圖片描述

非常感謝你的閱讀
大學的時候選擇了自學python,工作了發現吃了計算機基礎不好的虧,學歷不行這是

沒辦法的事,只能後天彌補,於是在編碼之外開啓了自己的逆襲之路,不斷的學習python核心知識,深

入的研習計算機基礎知識,整理好了,我放在我們的微信公衆號《程序員學府》,如果你也不甘平庸,

那就與我一起在編碼之外,不斷成長吧!

其實這裏不僅有技術,更有那些技術之外的東西,比如,如何

做一個精緻的程序員,而不是“屌絲”,程序員本身就是高貴的一種存在啊,難道不是嗎?點擊加入
想做你自己想成爲高尚人,加油!

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