【演算法工程師】Python面試問題總結

alicelmx發表於2019-04-14

演算法工程師的語言要求是一大一小,大的我選擇的是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是如何進行記憶體管理的(重要)

  1. Python利用記憶體池機制用於管理小塊記憶體的申請和釋放;
  2. 當建立大量佔用記憶體小的物件時,即頻繁呼叫new/malloc,會導致大量記憶體碎片,致使效率降低,所以需要記憶體池機制。
  3. 記憶體池機制需要在記憶體中預先申請一定數量的、大小相同的記憶體塊留作備用,當有新的記憶體需求時,先從記憶體池中,給這個需求分配記憶體,如果不夠了,就在重新申請。

Python垃圾回收機制(重要)

https://www.cnblogs.com/George1994/p/7349871.html

python利用引用計數實現跟蹤和回收垃圾,並在引用計數的基礎上,使用“標記-刪除”解決容器內部物件的迴圈引用問題,利用分代回收以空間換取時間進一步提高垃圾回收的效率。

  1. 引用計數
    當一個物件的引用被建立或者複製時,物件的引用計數+1;
    當一個物件的引用被銷燬時,物件的引用計數+1;
    當物件的引用計數為0時,表明這個物件不會再被使用,將其記憶體釋放掉。
  2. 標記-刪除
    尋找根物件的集合來作為垃圾檢測動作的起點,根物件的集合是全域性變數的引用或者函式棧的引用,這些引用所指向的物件不可能被刪除;從根物件出發,沿著根物件集合的每個引用,如果某個物件能夠到達,就說明這個物件是可達的,可達物件是不會被刪除的,這個過程就是垃圾檢測階段;垃圾檢測結束之後,所有物件被分為可達和不可達,可達物件被保留,釋放所有不可達物件的記憶體,這就是垃圾回收階段。
  3. 分代回收
    將系統中所有記憶體快按其存活時間劃分為多個集合,也就是“代”,python預設定義了三代物件集合,活得越久的物件越不可能是垃圾,應該減少對它的垃圾收集頻率。
    如何衡量“活得越久”:這個物件經過的垃圾收集次數。

談談裝飾器(重要)

  1. 本質:閉包函式;
  2. 作用:使其他函式在不修改程式碼的前提下增加額外功能;
  3. 返回值:函式物件;
  4. 優點:少寫很多重複性程式碼,提高工作效率。

為什麼使用裝飾器(重要)

http://python.jobbole.com/85393/

init.py檔案的作用

  1. init.py可以使其所在資料夾變為一個模組;
  2. python中倒入模組時,實際上就是匯入__init__.py。通常這個檔案為空,但是我們也可以在它中匯入我們需要的模組,而不用一個個匯入;
  3. 全部匯入。當使用from packageName import *時,import會將註冊在包__init__.py檔案中__all__列表中的所有子模組和子包匯入到當前作用域來。

map,filter,reduce函式

  1. map
    map(function, iterable, ...): 以引數序列中的每一個元素呼叫 function 函式,返回包含每次 function 函式返回值的新列表。
  2. filter
    filter(function, iterable): 函式用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。序列的每個元素作為引數傳遞給函式進行判,然後返回 True 或 False,最後將返回 True 的元素放到新列表中。
  3. reduce
    reduce(function, iterable[, initializer]): 用傳給 reduce 中的函式 function(有兩個引數)先對集合中的第 1、2 個元素進行操作,得到的結果再與第三個資料用 function 函式運算,最後得到一個結果。

迭代器和生成器(重要)

  1. 迭代器:
    1. 是Python最強大的功能之一,是訪問集合元素的一種方式;
    2. 迭代器是一個可以記住遍歷位置的物件;
    3. 迭代器從集合的第一個元素來開始訪問,直到訪問完所有的元素,只能向前,不能後退;
    4. 迭代器有兩個方法:next()iter()
  2. 生成器:
    1. python中,使用了yield的函式,被稱為生成器;
    2. 與普通函式不同,生成器返回的是一個迭代器物件,用於迭代;
    3. 在呼叫生成器執行過程中,每次遇到yield就暫停,並儲存當前所有的執行資訊,返回yield值,並在下一次執行next()時從當前位置繼續執行;
    4. 呼叫一個生成器,返回迭代器物件。

Python如何實現單例模式?(重要)

https://www.cnblogs.com/huchong/p/8244279.html

python實現多執行緒

http://www.runoob.com/python3/python3-multithreading.html

Python多執行緒的限制?多程式中如何傳遞引數?

  1. Python多執行緒中有GIL(全域性解釋鎖),意味著任何一個時間只能一個執行緒使用直譯器;
  2. 多程式中共享資料,可以使用multiprocessing.Value 和multiprocessing.Array

Python中賦值,淺拷貝,深拷貝的區別

http://www.cnblogs.com/xueli/p/4952063.html

  1. 賦值:淺拷貝物件的引用,物件發生改變,被賦值的也會作出同樣的改變;
  2. 淺拷貝(copy):沒有拷貝子物件,所以原始資料發生改變,子物件也會改變;
  3. 深拷貝(deepcopy):包含物件中子物件的拷貝,原始資料發生改變不會造成深拷貝里任何子元素的改變。

解釋繼承

  1. 一個類繼承自另外一個類,也可是說子類繼承自父類;
  2. 作用:可以使我們重用程式碼,還有更方便的建立和維護程式碼;
  3. 單繼承、多重繼承、多級繼承、分層繼承、混合繼承。

解釋以下dir() 和 help()

dir(): 返回物件中的所有成員;
hepl: 返回幫助文件和引數說明。

退出python時是否會釋放所有記憶體分配?

否。哪些具有物件迴圈引用全域性名稱空間引用的變數在python退出時,往往不會被釋放。

Python的應用場景?遇到IO密集型和計算密集型任務該如何處理?

  1. 應用場景:運維、爬蟲、資料分析、自然語言處理;
  2. IO密集型:使用多執行緒;計算密集型:使用Cpython編寫程式碼。

python區分大小寫嗎?

區分。

解釋以下python的閉包

如果在一個內部函式中,對外部作用域(而非全域性作用域)中的變數進行引用,那麼內部函式就是一個閉包。

如何提高Python的執行效率?

  1. 使用生成器;
  2. 關鍵程式碼使用外部功能包:CPython之類的;
  3. 迴圈優化:儘量避免在迴圈中訪問變數的屬性。

六個標準資料型別

  1. 不可變:number,string,tuple
  2. 可變:list,dict,set

Python如何定義一個函式(去年曾經問過我,恨!!!)

  1. def
  2. lambda(去年把這個忘了)

什麼是lambda函式?它有什麼好處?

詳細介紹:https://www.cnblogs.com/lmh001/p/9790378.html

  1. 接收任意多個引數(>=0個),並且返回單個表示式值的匿名函式
  2. 很輕便,即用即刪除,很適合需要完成一項功能,並且只在此處使用的功能。

介紹一下except的用法和作用

  1. 作用:捕獲異常 - 執行try下的語句,如果引發異常,則執行過程會跳到except語句。
  2. 用法:
 try:
<語句>        #執行別的程式碼
except <名字><語句>        #如果在try部份引發了'name'異常
except <名字><資料>:
<語句>        #如果引發了'name'異常,獲得附加的資料
else:
<語句>        #如果沒有異常發生

list和tuple的區別,如何實現二者的轉換

  1. list是可變長資料結構,tuple是定長的(即一旦初始化不可改變);
  2. list->tuple : tuple(list)
    tuple->list : list(tuple)

三元表示式

python中是不需要?的,而是使用: [on true] if [expression]else [on false]

如何在一個function裡面設定一個全域性的變數?

在function開始的地方插入一個global宣告

python程式中文輸出問題怎麼解決

  1. decode + encode

python 編碼問題:Python中字串是以unicode編碼的,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。

  1. 開頭加上:
reload(sys)
sys.setdefaultencoding(‘utf8′)

Python中pass語句的作用是什麼

空語句佔位符,為了保持程式結構的完整性。

*arg 與 **kwarg的作用

  1. *arg會把多出來的位置引數轉化為tuple
  2. **kwarg會把關鍵字引數轉化為dict。

is和==的區別

python物件中包含三個基本要素:id、type、value,

  1. is比較的是id是否相同,同一性運算子;
  2. ==比較的是value是否相同。

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

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

Python裡面match()和search()的區別?

  1. re模組中match(pattern,string[,flags]),檢查string的開頭是否與pattern匹配;
  2. re模組中research(pattern,string[,flags]),在string搜尋pattern的第一個匹配值。

用Python匹配HTML tag的時候,<.>和<.?>有什麼區別?

貪婪匹配( <.> )和非貪婪匹配(<.?> )

Python裡面如何生成隨機數

  1. random模組
  2. 具體:
random.randint(a,b):返回隨機整數x,a<=x<=b
random.randrange(start,stop,[,step]):返回一個範圍在(start,stop,step)之間的隨機整數
random.random( ):返回01之間的浮點數
random.uniform(a,b):返回指定範圍內的浮點數。

有沒有一個工具可以幫助查詢python的bug和進行靜態的程式碼分析?

VS code 中Pylint包

單引號,雙引號,三引號的區別

  1. 單引號和雙引號沒有區別;
  2. 三引號則可以直接換行,並且可以包含註釋。

如何用Python刪除一個檔案?Python如何copy一個檔案?

  1. os.remove(filename)
  2. shutil模組中的copyfile函式

相關文章