對於機器學習算法工程師而言,Python是不可或缺的語言,它的優美與簡潔使人沒法自拔。 那麼你瞭解過Python編程面試題嗎?從Python基礎到網頁爬蟲你是否能全方位Hold住? 本文主要從 Python 基礎、高級語句、網頁應用、數據庫和測試等角度出發, 可只關注本身須要的領域。
答:Python 是一門語法簡潔優美,功能強大無比,應用領域很是普遍,具備強大完備的第三方庫,他是一門強類型的可移植、可擴展,可嵌入的解釋型編程語言,屬於動態語言。和Java相比:Python比Java要簡單.Python是函數爲一等公民的語言,而Java是類爲一等公民的語言.Python是弱類型語言,而Java是強類型語言。和C相比:對於使用:Python的類庫齊全而且使用簡潔,不多代碼實現的功能用C可能要很複雜。對於速度:Python的運行速度相較於C,絕對是很慢了.Python和CPython解釋器都是C語言編寫。python
答:Python 是一門動態解釋性的強類型定義語言:編寫時無需定義變量類型;運行時變量類型強制固定;無需編譯,在解釋器環境直接運行。程序員
答:Python是一門解釋器語言,代碼想運行,必須經過解釋器執行,Python存在多種解釋器,分別基於不一樣語言開發,每一個解釋器有不一樣的特色,但都能正常運行Python代碼。
Python解釋器主要有如下幾個:web
答:Python是一門面向對象的語言。面向對象都有三大特性:封裝、繼承、多態。面試
下面分別來講說這三大特性:
**封裝:隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。**在python中用雙下劃線開頭的方式將屬性設置成私有的 。好處:1. 將變化隔離;2. 便於使用;3. 提升複用性;4. 提升安全性。
繼承:繼承是一種建立新類的方式,在python中,新建的類能夠繼承一個或多個父類,父類又可稱爲基類或超類,新建的類稱爲派生類或子類。即一個派生類繼承基類的字段和方法。
繼承也容許把一個派生類的對象做爲一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模擬"是一個(is-a)"關係 。python中類的繼承分爲:單繼承和多繼承ajax
1 class ParentClass1: #定義父類 2 3 class ParentClass2: #定義父類 4 5 class SubClass1(ParentClass1): #單繼承,基類是ParentClass1,派生類是SubClass 6 7 class SubClass2(ParentClass1,ParentClass2): #python支持多繼承,用逗號分隔開多個繼承的類
多態:一種事物的多種體現形式,函數的重寫其實就是多態的一種體現 。Python中,多態指的是父類的引用指向子類的對象 。實現多態的步驟:一、定義新的子類,二、重寫對應的父類方法,三、使用子類的方法直接處理,不調用父類的方法。多態的好處:(1)增長了程序的靈活性(2)增長了程序可擴展性正則表達式
答:Python 中主要有8種數據類型:number(數字)、string(字符串)、list(列表)、tuple(元組)、dict(字典)、set(集合)、Boolean(布爾值)、None(空值)。算法
答:range()和xrange()都是在循環中使用,輸出結果同樣。數據庫
答:編程
答:Python中看可變與不可變數據類型,主要是看變量所指向的內存地址處的值是否會改變 。
Python 的六種標準數據類型:數字、字符串、列表、元組、字典、集合。json
答:Python中生成器能作到迭代器能作的全部事,並且由於自動建立了__iter__()和next()方法,生成器顯得特別簡潔,並且生成器也是高效的,使用生成器表達式取代列表解析,同時節省內存。除了建立和保持程序狀態的自動生成,當發生器終結時,還會自動跑出StopIterration異常。
答:字典是 Python 提供的一種經常使用的數據結構,主要用於存放具備映射關係的數據 。好比保存某班同窗的成績單數據,張三:95分,李四:70分,王五:100分 … ,由於姓名和成績是有關聯的,因此不能單獨用兩個列表來分別保存,這時候用字典來存儲,再合適不過了 。
字典是一種可變的容器模型,它是經過一組鍵(key)值(value)對組成,這種結構類型一般也被稱爲映射,或者叫關聯數組,也有叫哈希表的。每一個key-value之間用「:」隔開,每組用「,」分割,整個字典用「{}」括起來 ,格式以下所示:
1 dictionary = {key1 : value1, key2 : value2 }
定義字典時,鍵前值後,鍵必須惟一性,值能夠不惟一,若是鍵有相同,值則取最後一個;值能夠是任何的數據類型,可是鍵必須是不可變的數據類型(數字、字符串、元組)。想要訪問字典中的值,只須要將鍵放入方括號裏,若是用字典裏沒有的鍵訪問數據,會輸出錯誤 。
答:Python字符串格式化主要有兩種方式:分別爲佔位符(%)和format方式 。文末還有2種要介紹,因此總共有4種 。
其中,佔位符(%)方式比較老,而format方式是比較先進的,目前二者共存。佔位符方式在Python2.x中用的比較普遍,隨着Python3.x的使用愈來愈廣,format方式使用的更加普遍。
答:http協議是超文本傳輸協議,是用於從萬維網服務器傳輸文本到本地瀏覽器的傳送協議,是基於tcp/ip通訊協議來傳輸數據的。
HTTP狀態碼(HTTP Status Code)是用以表示網頁服務器超文本傳輸協議響應狀態的3位數字代碼。它由 RFC 2616 規範定義的,並獲得 RFC 251八、RFC 281七、RFC 229五、RFC 2774 與 RFC 4918 等規範擴展。全部狀態碼的第一個數字表明瞭響應的五種狀態之一。
答:在Ruby、Python等動態編程語言中,猴子補丁僅指在運行時動態改變類或模塊,爲的是將第三方代碼打補丁在不按預期運行的bug或者feature上 。在運行時動態修改模塊、類或函數,一般是添加功能或修正缺陷。猴子補丁在代碼運行時內存中發揮做用,不會修改源碼,所以只對當前運行的程序實例有效。由於猴子補丁破壞了封裝,並且容易致使程序與補丁代碼的實現細節緊密耦合,因此被視爲臨時的變通方案,不是集成代碼的推薦方式。
答:垃圾回收機制(Garbage Collection:GC)基本是全部高級語言的標準配置之一了,在必定程度上,能優化編程語言的數據處理效率和提升編程軟件開發軟件的安全性能 。
在python中的垃圾回收機制主要是以引用****計數爲主要手段以標記清除和隔代回收機制爲輔的手段 。能夠對內存中無效數據的自動管理!
答:交換兩個變量的值方法,這個面試題若是隻寫一種固然很簡單,沒什麼能夠說的。
今天這個面試是問你們有幾種辦法來實現交換兩個變量的值 。
1 def swap(a,b): 2 temp = a 3 a = b 4 b = temp 5 print(a,b)
1 def swap2(a,b): 2 a,b = b,a 3 print(a,b)
1 def swap3(a, b): 2 a = a + b 3 b = a - b 4 a = a - b 5 print(a, b)
1 def swap4(a,b): 2 a = a ^ b 3 b = a ^ b 4 a = a ^ b 5 print(a,b)
答:在Python中,按位運算符有左移運算符(<<)、右移運算符(>>)、按位與運算(&)、按位或運算(|)、按位取反運算(~)、異或運算符,其中按位取反運算符爲單目運算符 。
答:在Python處理數據時,不可避免的要使用數據類型之間的轉換。簡單的諸如int、float、string之間的轉換;更有數組array、列表list之間的轉換。
如下是幾個內置的函數能夠執行數據類型之間的轉換。這些函數返回一個新的對象,表示轉換的值。
答:在Python實現二分查找法有兩種方法,分別用循環和遞歸方式。
二分查找法:搜索過程從數組的中間元素開始,若是中間元素正好是要查找的元素,則搜索過程結束;若是某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,並且跟開始同樣從中間元素開始比較。若是在某一步驟數組爲空,則表明找不到。這種搜索算法每一次比較都使搜索範圍縮小一半。注意若是要想使用二分查找,前提必須是元素有序排列 。
循環方式
1 def binary_search_2(alist,item): 2 """二分查找---循環版本""" 3 n = len(alist) 4 first = 0 5 last = n-1 6 while first <= last: 7 mid = (first + last)//2 8 if alist[mid] ==item: 9 return True 10 elif item < alist[mid]: 11 last = mid - 1 12 else: 13 first = mid + 1 14 return False 15 if __name__ == "__main__": 16 a = [1,5,6,10,11,13,18,37,99] 17 sorted_list_21 = binary_search_2(a, 18) 18 print(sorted_list_21) //True 19 sorted_list_22 = binary_search_2(a, 77) 20 print(sorted_list_22) //False
遞歸方式
1 def binary_search(alist,item): 2 """二分查找---遞歸實現""" 3 n = len(alist) 4 if n > 0: 5 mid = n//2 #數組長度的一半中間下標 6 if item == alist[mid] : 7 return True #查找成功 8 elif item < alist[mid]: 9 return binary_search(alist[:mid],item) 10 else: 11 return binary_search(alist[mid+1:], item) 12 else : 13 return False #失敗 14 if __name__ == "__main__": 15 a = [1,5,6,10,11,13,18,37,99] 16 # print(a) 17 sorted_list_11 = binary_search(a,37) 18 print(sorted_list_11)//True 19 sorted_list_12= binary_search(a, 88) 20 print(sorted_list_12)//False
答:在Python中lambda表達式也叫匿名函數,即函數沒有具體的名稱。lambda表達式是Python中一類特殊的定義函數的形式,使用它能夠定義一個匿名函數。與其它語言不一樣,Python的lambda表達式的函數體只能有單獨的一條語句,也就是返回值表達式語句。
lambda表達式,一般是在須要一個函數,可是又不想費神去命名一個函數的場合下使用 。lambda所表示的匿名函數的內容應該是很簡單的,若是複雜的話,就從新定義一個函數了。
lambda 表達式容許在一行代碼中建立一個函數並傳遞。lambda表達式在Python中的優勢和缺點: 一方面,Lambda函數的減小了代碼的行數,方便又簡潔。另外一方面,Lambda表達式有諸多限制,不能使用複雜邏輯。
1 add = lambda x, y : x+y 2 num =add(1,2) 3 print("x+y=",num) 4 #結果爲:x+y=3
答:在反射機制就是在運行時,動態的肯定對象的類型,並能夠經過字符串調用對象屬性、方法、導入模塊,是一種基於字符串的事件驅動。經過字符串的形式,去模塊尋找指定函數,並執行。利用字符串的形式去對象(模塊)中操做(查找/獲取/刪除/添加)成員。Python是一門解釋型語言,所以對於反射機制支持很好。
在Python中支持反射機制的函數有getattr()、setattr()、delattr()、exec()、eval()、import,這些函數均可以執行字符串。
2三、說說Python刪除list裏的重複元素有幾種方法?答:在Python中主要有5種方式,還沒看答案,你能想起幾種呢,面試筆試題常常碰到的一道題 。
使用set函數:set是定義集合的,無序,非重複numList =
1 [1,1,2,3,4,5,4] 2 print(list(set(numList))) 3 #[1, 2, 3, 4, 5]
先把list從新排序,而後從list的最後開始掃描
1 a = [1, 2, 4, 2, 4, 5,] 2 a.sort() 3 last = a[-1] 4 for i in range(len(a) - 2, -1, -1): 5 if last == a[i]: 6 del a[i] 7 else: 8 last = a[i] 9 print(a) #[1, 2, 4, 5]
使用字典函數
1 a=[1,2,4,2,4,] 2 b={} 3 b=b.fromkeys(a) 4 c=list(b.keys()) 5 print(c) #[1, 2, 4]
append方式
1 def delList(L): 2 L1 = [] 3 for i in L: 4 if i not in L1: 5 L1.append(i) 6 return L1 7 print(delList([1, 2, 2, 3, 3, 4, 5])) #[1, 2, 3, 4, 5]
count + remove方式
1 def delList(L): 2 for i in L: 3 if L.count(i) != 1: 4 for x in range((L.count(i) - 1)): 5 L.remove(i) 6 return L 7 print(delList([1, 2, 2, 3, 3, 4]))#[1, 2, 3, 4]
答:在Python中__new__和__init__具備不一樣的功能。而且對於Python的新類和舊類而言功能也不一樣。
答:在Python中help()和dir()這兩個函數均可以從Python解釋器直接訪問,並用於查看內置函數的合併轉儲。
答:不喜歡Python的人常常會吐嘈Python運行太慢。下面給你們介紹幾種種提升python執行效率的方法 。
答:單例模式(Singleton Pattern)是一種經常使用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實例存在。在 Python 中,你能夠想出幾種種方法來實現單例模式呢?筆試題中,手寫單例模式,也是常常碰到的,因此都要掌握下!
1)使用模塊實現:Python 的模塊就是自然的單例模式,由於模塊在第一次導入時,會生成 .pyc 文件,當第二次導入時,就會直接加載 .pyc 文件,而不會再次執行模塊代碼。所以,咱們只需把相關的函數和數據定義在一個模塊中,就能夠得到一個單例對象了。若是咱們真的想要一個單例類,能夠考慮這樣作:
1 #test1.py 2 class Singleton(object): 3 def foo(self): 4 pass 5 singleton = Singleton() 6 7 #test2.py 8 from test1 import singleton
2)用__new__特殊方法實現class Singleton:
1 def __new__(cls, *args, **kwargs): 2 if not hasattr(cls, '_instance'): 3 cls._instance = super(Singleton, cls).__new__(cls) 4 return cls._instance 5 def __init__(self, name): 6 self.name = name 7 s1 = Singleton('IT圈') 8 s2= Singleton('程序IT圈') 9 print(s1 == s2) # True
3)使用裝飾器實現def singleton(cls):
1 _instance = {} 2 def inner(*args, **kwargs): 3 if cls not in _instance: 4 _instance[cls] = cls(*args, **kwargs) 5 return _instance[cls] 6 return inner 7 @singleton 8 class Singleton: 9 def __init__(self, name): 10 self.name = name 11 s1 = Singleton('IT圈') 12 s2= Singleton('程序IT圈') 13 print(s1 == s2) # True
4)類裝飾器實現class Singleton:
def __init__(self, cls): self._cls = cls self._instance = {} def __call__(self, *args): if self._cls not in self._instance: self._instance[self._cls] = self._cls(*args) return self._instance[self._cls] @Singleton class Singleton: def __init__(self, name): self.name = name s1 = Singleton('IT圈') s2= Singleton('程序IT圈') print(s1 == s2) # True
5)使用元類實現方式class Singleton1(type):
1 def __init__(self, *args, **kwargs): 2 self.__instance = None 3 super(Singleton1, self).__init__(*args, **kwargs) 4 5 def __call__(self, *args, **kwargs): 6 if self.__instance is None: 7 self.__instance = super(Singleton1, self).__call__(*args, **kwargs) 8 return self.__instance 9 10 class Singleton(metaclass=Singleton1): 11 def __init__(self, name): 12 self.name = name 13 s1 = Singleton('IT圈') 14 s2= Singleton('程序IT圈') 15 print(s1 == s2) # True
答:自省是一種自我檢查行爲。在計算機編程中,自省是指這種能力:檢查某些事物以肯定它是什麼、它知道什麼以及它能作什麼。自省向程序員提供了極大的靈活性和控制力。
說的更簡單直白一點:自省就是面向對象的語言所寫的程序在運行時,可以知道對象的類型。一句能夠概況爲:運行時可以獲知對象的類型。
Python實現自省有不少方法,經常使用的有