閱讀本文大概需要3分鐘
每年的3-4月份是跳槽的高峰期,無論是應聘Python web開發,爬蟲工程師,或是數據分析,還是自動化運維,都涉及到一些基礎的知識!我挑了一些Python的基礎面試題,看看你能不能的答上來,也許面試的同學用的著!
Python是一種解釋型語言,這意味著,與C,C++不同,Python不需要在運行之前進行編譯。它是邊運行邊解釋。
Python是動態類型化的,這意味著當你聲明它們或類似的東西時,你不需要聲明變量的類型。你可以x=1 ,然後x="abc"沒有錯誤。
Python非常適合面向對象編程,因為它允許定義類以及組合和繼承。Python沒有訪問修飾符(如C ++的public,private).
在Python中函數是一等對象,這意味著它們可以在運行時動態創建,能賦值給變量或者作為參數傳給函數,還能能作為函數的返回值
Python代碼容易上手,開發速度很快,但運行速度通常比編譯語言慢。幸運的是,Python允許包含基於C的擴展,所以瓶頸可以被優化掉,比如,numpy包就是一個很好的例子,它非常快,因為它所做的很多運算在底部都是用C編寫的!
1).對象的賦值
Python中對象的賦值實際上是簡單的對象引用也就是說,當你創建一個對象,然後把它複製給另一個變量的時候,Python並沒有拷貝這個對象,而是拷貝了這個對象的引用。
2).淺拷貝
一般使用copy.copy(),可以進行對象的淺拷貝.它複製了對象但對於對象中的元素,依然使用原始的引用.
使用copy對a進行淺拷貝,b複製了a的對象,但是b裡面的[2,3,4]和a裡面的[2,3,4]其實都是指向同一塊內存地址,所以改變了a[1]之後,b裡面的b[1]也發生了改變!
3).深度拷貝
深度拷貝需要用copy.deepcopy()進行深拷貝。它會複製一個容器對象,以及它裡面的所有元素(包含元素的子元素)
當對a列表進行深度拷貝之後,b複製了a的對象,但是b裡面的[2,3,4]和a裡面的[2,3,4]其實都是指向不同的內存地址.
a[1].append(5)print (a)print (b)>>[1, [2, 3, 4, 5]]#因為是深度拷貝,改變了a[1],b[1]內容不會改變[1, [2, 3, 4]]
Python中==和is的區別
is是判讀對象標識符是否一致,而==是判讀兩個對象的內容是否相等!
線程如何在Python中實現
Python有一個多線程包threading,可以使用多線程來加快你的代碼。但是Python有一個叫做Global Interpreter Lock(GIL)的構造。GIL確保只有一個'線程'可以在任何時候執行。
線程獲取GIL,做一些工作,然後將GIL傳遞到下一個線程。這種情況發生得非常快,所以對於人眼而言,它可能看起來像你的線程並行執行,但它們實際上只是輪流使用相同的CPU內核。因此GIL的存在使得Python中的多線程無法真正的利用多核的優勢來提高性能。
對於IO密集型操作,在等待作業系統返回的時候會釋放GIL;再比如爬蟲因為有等待的伺服器的響應時間,可以利用多線程來加速!但是對於CPU密集型操作,只能通過多進程Multiprocess來加速。
Python中的猴子補丁是什麼?
考慮下面的例子:
>>
f()
猴子補丁:
是一種非常Pythonic的用法,即函數在python中可以像使用變量一樣對它進行賦值等操作,我們可以在運行時動態替換模塊,俗稱手法稱為猴子補丁!我們通過對MyClass.f 重新賦值,動態的改變了輸出的結果.
Python中的負數index是用來做什麼的?
Python中的序列是索引的,它由正數和負數組成。正的數字使用'0'作為第一個索引,'1'作為第二個索引。
負數的索引從'-1'開始,表示序列中的最後一個索引,'-2'作為倒數第二個索引,序列像正數一樣向前。
負數索引也可以用來非常方便的切片,比如:
s='abcdedf'
print (s[1:-1])
>>bcded
說說__new__和__init__的區別
__init__為初始化方法,而__new__方法才是是真正的構造函數。只有繼承了object的新式類才有__new__.
__new__至少要有一個參數cls,代表要實例化的類,此參數在實例化時由Python解釋器自動提供,__new__必須要有返回值,返回實例化出來的實例。
__init__有一個參數self,就是這個__new__返回的實例, 先運行__new__ 然後才運行__init__.
__init__在__new__的基礎上可以完成一些其它初始化的動作,__init__不需要返回值.
Python中的*args,**kwargs的用法
*args是可變參數,一般用來表示我們不能確定多少參數將被傳遞給函數,或者如果我們想用列表或元組的方式傳遞給函數.
**kwars是可變關鍵字參數,當我們不知道有多少關鍵字參數會傳遞給一個函數時,或者想把一個字典作為關鍵字參數時使用
註:*args和**kwargs可以同時在函數的定義中,但是*args必須在**kwargs前面.
思考題:Python中為啥沒有重載函數,歡迎留言討論!
推薦閱讀:
太好玩了!用Python寫個彈球遊戲2.0
Python武功如何快速進階
2017年度電影榜單出爐
雙十二來了,我爬取了淘寶上所有的羽絨服
南京樓市火嗎|16000套二手房數據分析
5分鐘帶你了解Python2和3的區別|從此不再糾結