【演算法工程師】Python面試問題總結
演算法工程師的語言要求是一大一小,大的我選擇的是java,但是我java學的並不好,emmm,難過。。。
所以就把python當作我最熟悉的語言,準備一點問題,防止他問到我的時候怪尷尬的,就比如去年京東就問我GC是怎麼回事,兩眼發懵。。。
以下鳴謝的文章都是面向Python開發的會涉及到一些Django和爬蟲的,有興趣可以看看,我的時間比較緊張,就放棄了。。。
鳴謝:
https://www.cnblogs.com/shunge/p/8120047.html
https://www.cnblogs.com/xuechaojun/archive/2018/12/13/10112001.html
https://blog.csdn.net/t8116189520/article/details/80165589
Python是如何進行記憶體管理的(重要)
- Python利用記憶體池機制用於管理小塊記憶體的申請和釋放;
- 當建立大量佔用記憶體小的物件時,即頻繁呼叫new/malloc,會導致大量記憶體碎片,致使效率降低,所以需要記憶體池機制。
- 記憶體池機制需要在記憶體中預先申請一定數量的、大小相同的記憶體塊留作備用,當有新的記憶體需求時,先從記憶體池中,給這個需求分配記憶體,如果不夠了,就在重新申請。
Python垃圾回收機制(重要)
python利用引用計數實現跟蹤和回收垃圾,並在引用計數的基礎上,使用“標記-刪除”解決容器內部物件的迴圈引用問題,利用分代回收以空間換取時間進一步提高垃圾回收的效率。
- 引用計數
當一個物件的引用被建立或者複製時,物件的引用計數+1;
當一個物件的引用被銷燬時,物件的引用計數+1;
當物件的引用計數為0時,表明這個物件不會再被使用,將其記憶體釋放掉。 - 標記-刪除
尋找根物件的集合來作為垃圾檢測動作的起點,根物件的集合是全域性變數的引用或者函式棧的引用,這些引用所指向的物件不可能被刪除;從根物件出發,沿著根物件集合的每個引用,如果某個物件能夠到達,就說明這個物件是可達的,可達物件是不會被刪除的,這個過程就是垃圾檢測階段;垃圾檢測結束之後,所有物件被分為可達和不可達,可達物件被保留,釋放所有不可達物件的記憶體,這就是垃圾回收階段。 - 分代回收
將系統中所有記憶體快按其存活時間劃分為多個集合,也就是“代”,python預設定義了三代物件集合,活得越久的物件越不可能是垃圾,應該減少對它的垃圾收集頻率。
如何衡量“活得越久”:這個物件經過的垃圾收集次數。
談談裝飾器(重要)
- 本質:閉包函式;
- 作用:使其他函式在不修改程式碼的前提下增加額外功能;
- 返回值:函式物件;
- 優點:少寫很多重複性程式碼,提高工作效率。
為什麼使用裝飾器(重要)
http://python.jobbole.com/85393/
init.py檔案的作用
- init.py可以使其所在資料夾變為一個模組;
- python中倒入模組時,實際上就是匯入__init__.py。通常這個檔案為空,但是我們也可以在它中匯入我們需要的模組,而不用一個個匯入;
- 全部匯入。當使用
from packageName import *
時,import會將註冊在包__init__.py檔案中__all__列表中的所有子模組和子包匯入到當前作用域來。
map,filter,reduce函式
- map
map(function, iterable, ...)
: 以引數序列中的每一個元素呼叫 function 函式,返回包含每次 function 函式返回值的新列表。 - filter
filter(function, iterable)
: 函式用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。序列的每個元素作為引數傳遞給函式進行判,然後返回 True 或 False,最後將返回 True 的元素放到新列表中。 - reduce
reduce(function, iterable[, initializer])
: 用傳給 reduce 中的函式 function(有兩個引數)先對集合中的第 1、2 個元素進行操作,得到的結果再與第三個資料用 function 函式運算,最後得到一個結果。
迭代器和生成器(重要)
- 迭代器:
- 是Python最強大的功能之一,是訪問集合元素的一種方式;
- 迭代器是一個可以記住遍歷位置的物件;
- 迭代器從集合的第一個元素來開始訪問,直到訪問完所有的元素,只能向前,不能後退;
- 迭代器有兩個方法:
next()
和iter()
。
- 生成器:
- python中,使用了yield的函式,被稱為生成器;
- 與普通函式不同,生成器返回的是一個迭代器物件,用於迭代;
- 在呼叫生成器執行過程中,每次遇到yield就暫停,並儲存當前所有的執行資訊,返回yield值,並在下一次執行next()時從當前位置繼續執行;
- 呼叫一個生成器,返回迭代器物件。
Python如何實現單例模式?(重要)
python實現多執行緒
Python多執行緒的限制?多程式中如何傳遞引數?
- Python多執行緒中有GIL(全域性解釋鎖),意味著任何一個時間只能一個執行緒使用直譯器;
- 多程式中共享資料,可以使用multiprocessing.Value 和multiprocessing.Array
Python中賦值,淺拷貝,深拷貝的區別
- 賦值:淺拷貝物件的引用,物件發生改變,被賦值的也會作出同樣的改變;
- 淺拷貝(copy):沒有拷貝子物件,所以原始資料發生改變,子物件也會改變;
- 深拷貝(deepcopy):包含物件中子物件的拷貝,原始資料發生改變不會造成深拷貝里任何子元素的改變。
解釋繼承
- 一個類繼承自另外一個類,也可是說子類繼承自父類;
- 作用:可以使我們重用程式碼,還有更方便的建立和維護程式碼;
- 單繼承、多重繼承、多級繼承、分層繼承、混合繼承。
解釋以下dir() 和 help()
dir()
: 返回物件中的所有成員;
hepl
: 返回幫助文件和引數說明。
退出python時是否會釋放所有記憶體分配?
否。哪些具有物件迴圈引用和全域性名稱空間引用的變數在python退出時,往往不會被釋放。
Python的應用場景?遇到IO密集型和計算密集型任務該如何處理?
- 應用場景:運維、爬蟲、資料分析、自然語言處理;
- IO密集型:使用多執行緒;計算密集型:使用Cpython編寫程式碼。
python區分大小寫嗎?
區分。
解釋以下python的閉包
如果在一個內部函式中,對外部作用域(而非全域性作用域)中的變數進行引用,那麼內部函式就是一個閉包。
如何提高Python的執行效率?
- 使用生成器;
- 關鍵程式碼使用外部功能包:CPython之類的;
- 迴圈優化:儘量避免在迴圈中訪問變數的屬性。
六個標準資料型別
- 不可變:number,string,tuple
- 可變:list,dict,set
Python如何定義一個函式(去年曾經問過我,恨!!!)
- def
- lambda(去年把這個忘了)
什麼是lambda函式?它有什麼好處?
- 接收任意多個引數(>=0個),並且返回單個表示式值的匿名函式;
- 很輕便,即用即刪除,很適合需要完成一項功能,並且只在此處使用的功能。
介紹一下except的用法和作用
- 作用:捕獲異常 - 執行try下的語句,如果引發異常,則執行過程會跳到except語句。
- 用法:
try:
<語句> #執行別的程式碼
except <名字>:
<語句> #如果在try部份引發了'name'異常
except <名字>,<資料>:
<語句> #如果引發了'name'異常,獲得附加的資料
else:
<語句> #如果沒有異常發生
list和tuple的區別,如何實現二者的轉換
- list是可變長資料結構,tuple是定長的(即一旦初始化不可改變);
- list->tuple :
tuple(list)
tuple->list :list(tuple)
三元表示式
python中是不需要?的,而是使用: [on true] if [expression]else [on false]
。
如何在一個function裡面設定一個全域性的變數?
在function開始的地方插入一個global宣告
python程式中文輸出問題怎麼解決
- decode + encode
python 編碼問題:Python中字串是以unicode編碼的,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。
- 開頭加上:
reload(sys)
sys.setdefaultencoding(‘utf8′)
Python中pass語句的作用是什麼
空語句佔位符,為了保持程式結構的完整性。
*arg 與 **kwarg的作用
- *arg會把多出來的位置引數轉化為tuple;
- **kwarg會把關鍵字引數轉化為dict。
is和==的區別
python物件中包含三個基本要素:id、type、value,
- is比較的是id是否相同,同一性運算子;
- ==比較的是value是否相同。
如何用Python來進行查詢和替換一個文字字串
- 可以使用re模組中的sub()函式來進行查詢和替換;
- 格式:
sub(replacement, string[,count=0])
(replacement是被替換成的文字,string是需要被替換的文字,count是一個可選引數,指最大被替換的數量)
Python裡面match()和search()的區別?
- re模組中
match(pattern,string[,flags])
,檢查string的開頭是否與pattern匹配; - re模組中
research(pattern,string[,flags])
,在string搜尋pattern的第一個匹配值。
用Python匹配HTML tag的時候,<.>和<.?>有什麼區別?
貪婪匹配( <.> )和非貪婪匹配(<.?> )
Python裡面如何生成隨機數
- random模組
- 具體:
random.randint(a,b):返回隨機整數x,a<=x<=b
random.randrange(start,stop,[,step]):返回一個範圍在(start,stop,step)之間的隨機整數
random.random( ):返回0到1之間的浮點數
random.uniform(a,b):返回指定範圍內的浮點數。
有沒有一個工具可以幫助查詢python的bug和進行靜態的程式碼分析?
VS code 中Pylint包
單引號,雙引號,三引號的區別
- 單引號和雙引號沒有區別;
- 三引號則可以直接換行,並且可以包含註釋。
如何用Python刪除一個檔案?Python如何copy一個檔案?
os.remove(filename)
- shutil模組中的copyfile函式
相關文章
- 面試問題總結(Java工程師 20190301)面試Java工程師
- 【演算法工程師】機器學習面試問題總結演算法工程師機器學習面試
- Python-爬蟲工程師-面試總結Python爬蟲工程師面試
- python工程師面試題Python工程師面試題
- 面試過了,總結測試工程師面試題(含答案)工程師面試題
- 測試工程師的面試總結工程師面試
- 轉:測試工程師的面試總結工程師面試
- Python工程師必看的面試問題與解答(中)Python工程師面試
- c++工程師面試問題C++工程師面試
- 面試總結——Java高階工程師面試Java工程師
- 面試問題總結面試
- 前端工程師面試題彙總(轉)前端工程師面試題
- 最近Java高階工程師面試總結Java工程師面試
- RabbitMq面試問題總結MQ面試
- PHP面試問題總結PHP面試
- REDIS面試問題總結Redis面試
- 【Java問題面試總結】Java面試
- 面試數十家Linux運維工程師,總結了這些面試題Linux運維工程師面試題
- 2019年,Python工程師必考的6個面試題,Python面試題No5Python工程師面試題
- 去面試Python工程師,這幾個基礎問題一定要能回答,Python面試題No4Python工程師面試題
- 面試題-測試工程師常見的基礎問題面試題工程師
- 資料結構和演算法面試題系列—揹包問題總結資料結構演算法面試題
- PHP開發工程師面試問題集錦PHP工程師面試
- 一個兩年Java工程師的面試總結Java工程師面試
- 面試題總結-演算法部分面試題演算法
- 又面試了Python爬蟲工程師,碰到這麼幾道面試題,Python面試題No9Python爬蟲工程師面試題
- 面試問題總結2018/05/16面試
- Java開發工程師常見的面試總結走起.....Java工程師面試
- 面試題總結面試題
- 史上最全的中高階JAVA工程師-面試題彙總Java工程師面試題
- Hadoop/Spark相關面試問題總結HadoopSpark面試
- HTTPS總結+相關面試問題解答HTTP面試
- 【機器學習】【深度學習】【人工智慧】【演算法工程師】面試問題彙總(持續更新)機器學習深度學習人工智慧演算法工程師面試
- [演算法總結] 17 題搞定 BAT 面試——連結串列題演算法BAT面試
- 【資源】NLP 演算法工程師相關的面試題演算法工程師面試題
- Python工程師求職必知的經典面試題!Python工程師求職面試題
- Python工程師求職必知的經典面試題Python工程師求職面試題
- Python 面試總結(一)Python面試