【純乾貨!!!】全網最實用Python面試大全,一共30道題目+答案的純乾貨!!!(建議收藏)

【純乾貨!!!】花費了整整3天,整理出來的全網最實用Python面試大全,一共30道題目+答案的純乾貨,但願你們多多支持,建議 點贊!!收藏!!長文警告,全文共12000+字,涵蓋Python面試可能遇到的全部問題,但願對你們有幫助,不過你們最好不要硬背,實戰大於理論。祝你們面試順利!

 

在這裏插入圖片描述

對於機器學習算法工程師而言,Python是不可或缺的語言,它的優美與簡潔使人沒法自拔。
那麼你瞭解過Python編程面試題嗎?從Python基礎到網頁爬蟲你是否能全方位Hold住?
本文主要從 Python 基礎、高級語句、網頁應用、數據庫和測試等角度出發,
可只關注本身須要的領域。

 

 

一、談談對 Python 和其餘語言的區別?

答:Python 是一門語法簡潔優美,功能強大無比,應用領域很是普遍,具備強大完備的第三方庫,他是一門強類型的可移植、可擴展,可嵌入的解釋型編程語言,屬於動態語言。和Java相比:Python比Java要簡單.Python是函數爲一等公民的語言,而Java是類爲一等公民的語言.Python是弱類型語言,而Java是強類型語言。和C相比:對於使用:Python的類庫齊全而且使用簡潔,不多代碼實現的功能用C可能要很複雜。對於速度:Python的運行速度相較於C,絕對是很慢了.Python和CPython解釋器都是C語言編寫。python

二、談談Python 的特色和優勢是什麼?

答:Python 是一門動態解釋性的強類型定義語言:編寫時無需定義變量類型;運行時變量類型強制固定;無需編譯,在解釋器環境直接運行。程序員

  • 解釋性:一個用編譯型語言(如 C 或 C++)寫的程序,能夠從源文件轉換到一個計算機使用的語言。這個過程主要經過編譯器完成。當運行程序的時候,咱們能夠把程序從硬盤複製到內存中而且運行。而 Python 語言寫的程序,則不須要編譯成二進制代碼,能夠直接從源代碼運行程序。在計算機內部,由 Python 解釋器把源代碼轉換成字節碼的中間形式,而後再把它翻譯成計算機使用的機器語言並運行。
  • 動態性:在運行時能夠改變其結構的語言 :例如新的函數、對象、甚至代碼能夠被引進,已有的函數能夠被刪除或是其餘結構上的變化。動態語言目前很是具備活力。Python即是一個動態語言,除此以外如 PHP 、 Ruby 、 JavaScript 等也都屬於動態語言 。面向對象:面向對象編程簡單來講就是基於對 類 和 對象 的使用,全部的代碼都是經過類和對象來實現的編程就是面向對象編程!
  • 面向對象的三大特性:封裝、繼承、多態語法簡潔:Python 是一種表明簡單注意思想的語言,閱讀一個良好的 Python 程序,即便是在 Python 語法要求很是嚴格的大環境下,給人的感受也像是在讀英語段落同樣。
  • 換句話說,Python 編程語言最大的優勢之一,是其具備僞代碼的特質,它可讓咱們在開發 Python 程序時,專一於解決問題,而不是搞明白語言自己。
  • 開源:Python 是開源的,簡單地理解就是,用戶使用 Python 進行開發和發佈本身編寫的程序,不須要支付任何費用,也不用擔憂版權問題,即便做爲商業用途,Python 也是免費的。開源正在成爲軟件行業的一種發展趨勢,如今有不少商業軟件公司都開始將本身的產品變成開源的(例如 Java)。也許,Python 的開源正是它如此優秀的緣由之一,由於會有這麼一羣人,他們但願看到一個更加優秀的 Python,從而爲了這個目標,不斷地對 Python 進行創造,不斷地改進。
  • 可擴展性:Python 的可擴展性體現爲它的模塊,Python 具備腳本語言中最豐富和強大的類庫,這些類庫覆蓋了文件 I/O、GUI、網絡編程、數據庫訪問、文本操做等絕大部分應用場景。

三、說說Python解釋器種類以及特色?

答:Python是一門解釋器語言,代碼想運行,必須經過解釋器執行,Python存在多種解釋器,分別基於不一樣語言開發,每一個解釋器有不一樣的特色,但都能正常運行Python代碼。
Python解釋器主要有如下幾個:web

  • CPython:官方版本的解釋器:CPython。這個解釋器是用C語言開發的,因此叫CPython。在命令行下運行python就是啓動CPython解釋器。CPython是使用最廣且被的Python解釋器。
  • IPython:IPython是基於CPython之上的一個交互式解釋器,也就是說,IPython只是在交互方式上有所加強,可是執行Python代碼的功能和CPython是徹底同樣的。CPython用>>>做爲提示符,而IPython用In [序號]:做爲提示符。
  • PyPy:PyPy是另外一個Python解釋器,它的目標是執行速度。PyPy採用JIT技術,對Python代碼進行動態編譯(注意不是解釋),因此能夠顯著提升Python代碼的執行速度。絕大部分Python代碼均可以在PyPy下運行,可是PyPy和CPython有一些是不一樣的,這就致使相同的Python代碼在兩種解釋器下執行可能會有不一樣的結果。若是你的代碼要放到PyPy下執行,就須要瞭解PyPy和CPython的不一樣點。
  • Jython:Jython是運行在Java平臺上的Python解釋器,能夠直接把Python代碼編譯成Java字節碼執行。
  • IronPython:IronPython和Jython相似,只不過IronPython是運行在微軟.Net平臺上的Python解釋器,能夠直接把Python代碼編譯成.Net的字節碼。在這些Python解釋器中,使用普遍的是CPython 。

四、說說Python面向對象三大特性?

答: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 中有幾種數據類型?

答:Python 中主要有8種數據類型:number(數字)、string(字符串)、list(列表)、tuple(元組)、dict(字典)、set(集合)、Boolean(布爾值)、None(空值)。算法

  • 若是對軟件測試有興趣,想了解更多的測試知識,解決測試問題,以及入門指導,
    幫你解決測試中遇到的困惑,咱們這裏有技術高手。若是你正在找工做或者剛剛學校出來,
    又或者已經工做可是常常以爲難點不少,以爲本身測試方面學的不夠精想要繼續學習的,
    想轉行怕學不會的,均可以加入咱們644956177。
    羣內可領取最新軟件測試大廠面試資料和Python自動化、接口、框架搭建學習資料!

六、說說Python中xrange和range的區別?

答:range()和xrange()都是在循環中使用,輸出結果同樣。數據庫

  • range()返回的是一個list對象,而xrange返回的是一個生成器對象(xrange object)。
  • xrange()則不會直接生成一個list,而是每次調用返回其中的一個值,內存空間使用極少。於是性能很是好,因此儘可能用xrange吧。在python3 中沒有xrange,只有range。range和python2 中的xrange()同樣。
    在這裏插入圖片描述

七、Python變量、函數、類的命名規則?

答:編程

  • (1)不能以數字開頭,不能出現中文。
  • (2)命名以字母開頭,包含數字,字母(區分大小寫),下劃線。
  • (3)不能包含關鍵字,見名知意。

八、說說Python可變與不可變數據類型的區別?

答:Python中看可變與不可變數據類型,主要是看變量所指向的內存地址處的值是否會改變 。
Python 的六種標準數據類型:數字、字符串、列表、元組、字典、集合。json

  • 不可變數據(3個):Number(數字)、String(字符串)、Tuple(元組)。
  • 可變數據(3個):List(列表)、Dictionary(字典)、Set(集合)。
    在這裏插入圖片描述

九、列舉幾個Python中的標準異常類?

在這裏插入圖片描述

在這裏插入圖片描述

十、說說Python中迭代器和生成器的區別?

答:Python中生成器能作到迭代器能作的全部事,並且由於自動建立了__iter__()和next()方法,生成器顯得特別簡潔,並且生成器也是高效的,使用生成器表達式取代列表解析,同時節省內存。除了建立和保持程序狀態的自動生成,當發生器終結時,還會自動跑出StopIterration異常。

  • 列表、元組、字典、字符串都是可迭代對象。
  • 數字、布爾值都是不可迭代的。

十一、說說Python字典以及基本操做?

答:字典是 Python 提供的一種經常使用的數據結構,主要用於存放具備映射關係的數據 。好比保存某班同窗的成績單數據,張三:95分,李四:70分,王五:100分 … ,由於姓名和成績是有關聯的,因此不能單獨用兩個列表來分別保存,這時候用字典來存儲,再合適不過了 。
字典是一種可變的容器模型,它是經過一組鍵(key)值(value)對組成,這種結構類型一般也被稱爲映射,或者叫關聯數組,也有叫哈希表的。每一個key-value之間用「:」隔開,每組用「,」分割,整個字典用「{}」括起來 ,格式以下所示:

1 dictionary = {key1 : value1, key2 : value2 }

 

 

定義字典時,鍵前值後,鍵必須惟一性,值能夠不惟一,若是鍵有相同,值則取最後一個;值能夠是任何的數據類型,可是鍵必須是不可變的數據類型(數字、字符串、元組)。想要訪問字典中的值,只須要將鍵放入方括號裏,若是用字典裏沒有的鍵訪問數據,會輸出錯誤 。

十二、說說Python種有幾種字符串格式化?

答:Python字符串格式化主要有兩種方式:分別爲佔位符(%)和format方式 。文末還有2種要介紹,因此總共有4種 。
其中,佔位符(%)方式比較老,而format方式是比較先進的,目前二者共存。佔位符方式在Python2.x中用的比較普遍,隨着Python3.x的使用愈來愈廣,format方式使用的更加普遍。

在這裏插入圖片描述

1三、說說Python多線程與多進程的區別?

  • 一、多線程能夠共享全局變量,多進程不能
  • 二、多線程中,全部子線程的進程號相同;多進程中,不一樣的子進程進程號不一樣
  • 三、線程共享內存空間;進程的內存是獨立的 。
  • 四、同一個進程的線程之間能夠直接交流;兩個進程想通訊,必須經過一箇中間代理來實現
  • 五、建立新線程很簡單;建立新進程須要對其父進程進行一次克
  • 六、一個線程能夠控制和操做同一進程裏的其餘線程;可是進程只能操做子進程二者最大的不一樣在於:在多進程中,同一個變量,各自有一份拷貝存在於每一個進程中,互不影響;而多線程中,全部變量都由全部線程共享。

1四、說說Python中HTTP常見響應狀態碼?

答:http協議是超文本傳輸協議,是用於從萬維網服務器傳輸文本到本地瀏覽器的傳送協議,是基於tcp/ip通訊協議來傳輸數據的。
HTTP狀態碼(HTTP Status Code)是用以表示網頁服務器超文本傳輸協議響應狀態的3位數字代碼。它由 RFC 2616 規範定義的,並獲得 RFC 251八、RFC 281七、RFC 229五、RFC 2774 與 RFC 4918 等規範擴展。全部狀態碼的第一個數字表明瞭響應的五種狀態之一。

1五、說說Python中猴子補丁是什麼?

答:在Ruby、Python等動態編程語言中,猴子補丁僅指在運行時動態改變類或模塊,爲的是將第三方代碼打補丁在不按預期運行的bug或者feature上 。在運行時動態修改模塊、類或函數,一般是添加功能或修正缺陷。猴子補丁在代碼運行時內存中發揮做用,不會修改源碼,所以只對當前運行的程序實例有效。由於猴子補丁破壞了封裝,並且容易致使程序與補丁代碼的實現細節緊密耦合,因此被視爲臨時的變通方案,不是集成代碼的推薦方式。

1六、說說Python中的垃圾回收機制?

答:垃圾回收機制(Garbage Collection:GC)基本是全部高級語言的標準配置之一了,在必定程度上,能優化編程語言的數據處理效率和提升編程軟件開發軟件的安全性能 。
在python中的垃圾回收機制主要是以引用****計數爲主要手段以標記清除和隔代回收機制爲輔的手段 。能夠對內存中無效數據的自動管理!

1七、說說Python中有幾種辦法交換兩個變量的值?

答:交換兩個變量的值方法,這個面試題若是隻寫一種固然很簡單,沒什麼能夠說的。
今天這個面試是問你們有幾種辦法來實現交換兩個變量的值 。

  • 方法一:經過新添加中間變量temp的方式,這個方法是最簡單的,每一個語言都適用。
1     def swap(a,b):
2     temp = a
3     a = b
4     b = temp
5     print(a,b)

 

 

 

  • 方法二:Python獨有的方法,一行代碼就能搞定,直接將兩個變量放到元組中 。
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開始編數,而後比較兩個二進制數值相同位置的數,若是相同結果爲0,不一樣時結果爲1 。 「1^1=0 1^0=1 0^0=0」
    如: 1010
    1111
    則結果爲 0101
1    def swap4(a,b):
2     a = a ^ b
3     b = a ^ b
4     a = a ^ b
5     print(a,b)

 

 

1八、說說Python中的6種位運算符?

答:在Python中,按位運算符有左移運算符(<<)、右移運算符(>>)、按位與運算(&)、按位或運算(|)、按位取反運算(~)、異或運算符,其中按位取反運算符爲單目運算符 。

1九、說說Python中的類型轉換有哪些?

答:在Python處理數據時,不可避免的要使用數據類型之間的轉換。簡單的諸如int、float、string之間的轉換;更有數組array、列表list之間的轉換。
如下是幾個內置的函數能夠執行數據類型之間的轉換。這些函數返回一個新的對象,表示轉換的值。
在這裏插入圖片描述

20、Python中實現二分查找的2種方法?

答:在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

 

 

 

2一、說說Python中的lambda表達式?

答:在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

 

2二、說說Python中的反射?

答:在反射機制就是在運行時,動態的肯定對象的類型,並能夠經過字符串調用對象屬性、方法、導入模塊,是一種基於字符串的事件驅動。經過字符串的形式,去模塊尋找指定函數,並執行。利用字符串的形式去對象(模塊)中操做(查找/獲取/刪除/添加)成員。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]

2四、說說Python中的__new__和__init__的區別?

答:在Python中__new__和__init__具備不一樣的功能。而且對於Python的新類和舊類而言功能也不一樣。

  • __new__是在實例建立以前被調用的,由於它的任務就是建立實例而後返回該實例對象,是個靜態方法。
  • __init__是當實例對象建立完成後被調用的,而後設置對象屬性的一些初始值,一般用在初始化一個類實例的時候。是一個實例方法。
  • 主要區別在於:__new__是用來創造一個類的實例的,而__init__是用來初始化一個實例的。

- 2五、說說Python中的help()和dir()函數?

答:在Python中help()和dir()這兩個函數均可以從Python解釋器直接訪問,並用於查看內置函數的合併轉儲。

  • help()函數:help()函數用於顯示文檔字符串,還能夠查看與模塊,關鍵字,屬性等相關的使用信息。
  • dir()函數:dir()函數能夠列出指定類或模塊包含的所有內容(包括函數、方法、類、變量等)

2六、說說提升Python運行效率的技巧?

答:不喜歡Python的人常常會吐嘈Python運行太慢。下面給你們介紹幾種種提升python執行效率的方法 。

  • 使用局部變量:儘可能使用局部變量代替全局變量:便於維護,提升性能並節省內存。一方面能夠提升程序性能,局部變量查找速度更快;另外一方面可用簡短標識符替代冗長的模塊變量,提升可讀性。
  • 使用較新的Python版本:Python已經更新了不少個版本,每一個版本的Python都會包含優化內容,使其運行速度優於以前的版本,因此你們記得常常更新版本哦!
  • 先編譯後調用:使用eval()、exec()函數執行代碼時,最好調用代碼對象(提早經過compile()函數編譯成字節碼),而不是直接調用str,能夠避免屢次執行重複編譯過程,提升程序性能。正則表達式模式匹配也相似,也最好先將正則表達式模式編譯成regex對象(經過re.complie()函數),而後再執行比較和匹配。
  • 採用生成器表達式替代列表解析:列表解析會產生整個列表,對大量數據的迭代會產生負面效應。而生成器表達式則不會,其不會真正建立列表,而是返回一個生成器,在須要時產生一個值(延遲計算),對內存更加友好。
  • 關鍵代碼使用外部功能包:使用 C/C++ 或機器語言的外部功能包處理時間敏感任務,能夠有效提升應用的運行效率。這些功能包每每依附於特定的平臺,所以你要根據本身所用的平臺選擇合適的功能包 。好比下面四個功能包:Cython、Pylnlne、PyPy、Pyrex 。
  • 在排序時使用鍵:Python 含有許多古老的排序規則,這些規則在你建立定製的排序方法時會佔用不少時間,而這些排序方法運行時也會拖延程序實際的運行速度。最佳的排序方法實際上是儘量多地使用鍵和內置的 sort() 方法。
  • 優化算法時間:算法的時間複雜度對程序的執行效率影響最大,在Python中能夠經過選擇合適的數據結構來優化時間複雜度,如list和set查找某一個元素的時間複雜度分別是O(n)和O(1)。不一樣的場景有不一樣的優化方式,總得來講,通常有分治,分支界限,貪心,動態規劃等思想。
  • 循環優化:「每種編程語言都會強調須要優化循環。當使用Python的時候,你能夠依靠大量的技巧使得循環運行得更快。
  • 技巧 1:減小循環內部沒必要要的計算
  • 技巧 2:嵌套循環中,儘可能減小內層循環的計算
  • 技巧 3:儘可能使用局部變量
  • 技巧 4:使用 join() 鏈接字符串
  • 交叉編譯你的應用:計算機其實並不理解用來建立現代應用程序的編程語言,計算機理解的是機器語言。因此咱們能夠用Python語言編寫應用,再以C++這樣的語言運行你的應用,這在運行的角度來講,是可行的。Nuitka是一款有趣的交叉編譯器,能將你的Python代碼轉化成C++代碼。這樣,你就能夠在native模式下執行本身的應用,而無需依賴於解釋器程序。你會發現本身的應用運行效率有了較大的提升,可是這會因平臺和任務的差別而有所不一樣。

- 2七、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

 

 

2八、Python實現自省的方法有哪些?

答:自省是一種自我檢查行爲。在計算機編程中,自省是指這種能力:檢查某些事物以肯定它是什麼、它知道什麼以及它能作什麼。自省向程序員提供了極大的靈活性和控制力。
說的更簡單直白一點:自省就是面向對象的語言所寫的程序在運行時,可以知道對象的類型。一句能夠概況爲:運行時可以獲知對象的類型。
Python實現自省有不少方法,經常使用的有

  • type(),判斷對象類型dir(), 帶參數時得到該對象的全部屬性和方法;不帶參數時,返回當前範圍內的變量、方法和定義的類型列表
  • help() , 用於查看函數或模塊用途的詳細說明
  • isinstance(),判斷對象是不是已知類型issubclass(),判斷一個類是否是另外一個類的子類
  • hasattr(),判斷對象是否包含對應屬性
  • getattr(),獲取對象屬性
  • setattr(), 設置對象屬性
  • id(): 用於獲取對象的內存地址
  • callable():判斷對象是否能夠被調用。

在這裏插入圖片描述

- 2九、簡述一下爬蟲的步驟?

  • 肯定需求;
  • 肯定資源;
  • 經過url獲取網站的返回數據;
  • 定位數據;
  • 存儲數據。

- 30、遇到的反爬蟲策略以及解決方法?

  • 經過headers反爬蟲:自定義headers,添加網頁中的headers數據。
  • 基於用戶行爲的反爬蟲(封IP):可使用多個代理IP爬取或者將爬取的頻率下降。
  • 動態網頁反爬蟲(JS或者Ajax請求數據):動態網頁可使用 selenium + phantomjs 抓取。
  • 對部分數據加密處理(數據亂碼):找到加密方法進行逆向推理。
    常見的反爬蟲和應對方法有:
  • 基於用戶行爲,同一個ip段時間屢次訪問同一頁面 利用代理ip,構建ip池
  • 請求頭裏的user-agent 構建user-agent池(操做系統、瀏覽器不一樣,模擬不一樣用戶)
  • 動態加載(抓到的數據和瀏覽器顯示的不同),js渲染 模擬ajax請求,返回json形式的數據
  • selenium / webdriver 模擬瀏覽器加載
  • 對抓到的數據進行分析
  • 加密參數字段 會話跟蹤【cookie】 防盜鏈設置【Referer】
  • 若是對軟件測試有興趣,想了解更多的測試知識,解決測試問題,以及入門指導,
    幫你解決測試中遇到的困惑,咱們這裏有技術高手。若是你正在找工做或者剛剛學校出來,
    又或者已經工做可是常常以爲難點不少,以爲本身測試方面學的不夠精想要繼續學習的,
    想轉行怕學不會的,均可以加入咱們644956177。
    羣內可領取最新軟件測試大廠面試資料和Python自動化、接口、框架搭建學習資料!
    之後遇到更多的問題會加更,祝你們面試順利!共勉。

在這裏插入圖片描述

相關文章
相關標籤/搜索