python面試問題集錦


GIL(全局解釋器鎖)

  描述Python GIL的概念, 以及它對python多線程的影響?編寫一個多線程抓取網頁的程序,並闡明多線程抓取程序是否可比單線程性能有提升,並解釋原因。

1.python語言和GIL沒有任何關系,GIL不是python語言的特性,僅僅是因為歷史原因在Cpython解釋器,難以移除GIL

2.GIL:全局解釋器鎖。每個線程在執行的過程都需要先獲取GIL,保證同一時刻只有一個線程執行代碼

3.Python使用多進程(mutilprocess)代替多線程(threading),可以利用多核的CPU資源的

4.線程釋放GIL鎖的情況:在IO操作等可能會引起阻塞的系統調用之前,會暫時釋放GIL,但在執行完畢之后,會重新獲得GIL

5.多線程比單線程爬取有所提升,在遇到IO阻塞的時候會釋放GIL,達到多線程爬出的目的。

 

深拷貝、淺拷貝(copy.copy   copy.deepcopy)

淺拷貝是對一個對象的頂層拷貝,只拷貝引用,沒有拷貝內容 。

深拷貝是對一個對象的所有層次的拷貝(本質上遞歸淺拷貝),開辟一個新的空間。分片表達式進行的拷貝是深拷貝,字典的copy是深拷貝。

對可變數據類型(列表、字典、集合)進行淺拷貝,只是指向引用地址,不會開辟新的空間

對不可變數據類型(數字、字符串、元組)進行淺拷貝,會開辟一個新的空間(僅僅是最頂層開辟了新的空間,里層的元素地址還是一樣的)

淺拷貝后,改變原始對象中可變類型的元素的值,拷貝對象的值也隨之改變。改變原始對象中不可變類型元素的值,拷貝對象的值也不會改變

 

面向對象的三大特性(封裝、繼承、多態)

封裝:把客觀事物封裝成抽象的類,類可以把自己的屬性和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。在一個對象內部,某些代碼或某些數據可以是私有的,不能被外界訪問。通過這種方式,對象對內部數據提供了不同級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。

繼承:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴展。提高了代碼的重用性,能夠對代碼進行有效的管理,當某個類有問題只要修改這個類即可,而其繼承的子類不需要修改

多態:必須是在繼承的基礎上,一個類實例的相同方法在不同情形下有不同的表現形式。多態機制使具有不同內部結構的對象可以共享相同的外部接口。雖然針對不同對象的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以調用。

鴨子類型:在程序設計中,鴨子類型是動態類型的一種風格。在這種風格中,一個對象有效的語義,不是由這個對象繼承特定的類或實現特定的接口,而是由當前方法和屬性集合決定。“當看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子。”鴨子類型中,關注的不是對象的類型本身,而是它是如何使用的。

 

新式類和經典類的區別,在多繼承上。經典類(python2.x)會進行深度優先繼承。新式類(python3.x)默認繼承object,會進行廣度優先查找。

@property:可以把一個實例方法變成其同名屬性,以支持.號訪問獲得方法返回值。property屬性內部進行一系列的邏輯計算,最終將計算結果返回。

 

閉包:在一個外函數中定義了一個內函數,內函數里運用了外函數的臨時變量,並且外函數的返回值是內函數的引用,這樣就構成了一個閉包。在閉包內函數想要修改外部臨時變量時,需要加上nonlocal xx。

一個簡單的閉包函數:

def outer():
a = 10
def inner():
b = 22
nonlocal a
a = 100
print(a+b)
return inner

if __name__ == '__main__':
x = outer()
x()

裝飾器:寫代碼需要遵循開放封閉原則,已經實現的功能代碼不允許被修改,但是可以擴展。裝飾器的作用就是在不改變原有函數功能的情況下,為其添加額外的功能。

裝飾器的功能:1.作為引入日志  2.函數執行時間的統計  3.執行函數前預備處理  4.執行函數后清理功能 5.權限校驗等場景 6.緩存

一個簡單的裝飾器:

# wrapper裝飾器,傳入函數作為變量,由內函數調用
def outer_wrapper(func):
def wrapper(*args,**kwargs): # 進行函數的裝飾
# 權限校驗等場景
# 驗證1
# 驗證2
# 驗證3
pass
func()
return wrapper

@outer_wrapper
def f1():
print('f1')

使用裝飾器實現一個單例:

 

def singleton(cls,*args,**kwargs):
instances = {}
def get_instance(*args,**kwargs):
if cls not in instances:
instances[cls] = cls(*args,**kwargs)
return instances[cls]
return get_instance

 

單例:是軟件設計的一種模式,該模式的目的主要是確保某一個類只有一個實例存在

 使用__new__方法實現一個單例:

class SingleTon(object):
_instance = {}
def __new__(cls,*args,**kwargs):
if cls not in cls._instance:
# 重寫父類的__new__實現單例
cls._instance[cls] = super(SingleTon,cls).__new__(cls,*args,**kwargs)
print(cls._instance)
return cls._instance[cls]

 

灑灑水

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM