1. 程式人生 > 實用技巧 >python 面試題整理

python 面試題整理


1.一行程式碼實現1--100之和

>>> 
>>> sum(range(1,101))
5050
>>> 

2.Python是如何進行記憶體管理的?

從三個方面來說,主要有方面的措施:物件的引用計數機制、垃圾回收機制、記憶體池機制。

一、物件的引用計數機制
Python內部使用引用計數,來保持追蹤記憶體中的物件,所有物件都有引用計數。

引用計數增加的情況:

1、一個物件分配一個新名稱

2、將其放入一個容器中(如列表、元組或字典)

引用計數減少的情況:

1、使用del語句對物件別名顯示的銷燬

2、引用超出作用域或被重新賦值

sys.getrefcount( )函式可以獲得物件的當前引用計數

多數情況下,引用計數比你猜測得要大得多。對於不可變資料(如數字和字串),直譯器會在程式的不同部分共享記憶體,以便節約記憶體。

二、垃圾回收
1、當一個物件的引用計數歸零時,它將被垃圾收集機制處理掉。

2、當兩個物件a和b相互引用時,del語句可以減少a和b的引用計數,並銷燬用於引用底層物件的名稱。然而由於每個物件都包含一個對其他物件的應用,因此引用計數不會歸零,物件也不會銷燬。(從而導致記憶體洩露)。為解決這一問題,直譯器會定期執行一個迴圈檢測器,搜尋不可訪問物件的迴圈並刪除它們。

三、記憶體池機制
Python提供了對記憶體的垃圾收集機制,但是它將不用的記憶體放到記憶體池而不是返回給作業系統。

1、Pymalloc機制。為了加速Python的執行效率,Python引入了一個記憶體池機制,用於管理對小塊記憶體的申請和釋放。

2、Python中所有小於256個位元組的物件都使用pymalloc實現的分配器,而大的物件則使用系統的malloc。

3、對於Python物件,如整數,浮點數和List,都有其獨立的私有記憶體池,物件間不共享他們的記憶體池。也就是說如果你分配又釋放了大量的整數,用於快取這些整數的記憶體就不能再分配給浮點數。

3.如何在一個函式內部修改全域性變數

a=1

def change():
global a
a=10

print(a)
change()
print(a)

輸出

macname@MacdeMBP ~ % python3 test.py
1
10
macname@MacdeMBP ~ % 

4.列出5個python標準庫

os:提供了不少與作業系統相關聯的函式

sys: 通常用於命令列引數

re: 正則匹配

math: 數學運算

datetime:處理日期時間

5.字典如何刪除鍵和合並兩個字典

a={"key1":"v1","key2":"v2"}
b={"key3":"v3","key4":"v4"}

print(a)
del a["key1"]
print(a)

a.update(b)
print(a)

輸出

macname@MacdeMBP ~ % python3 test.py
{'key1': 'v1', 'key2': 'v2'}
{'key2': 'v2'}
{'key2': 'v2', 'key3': 'v3', 'key4': 'v4'}
macname@MacdeMBP ~ % 

6.談下python的GIL

GIL 是python的全域性直譯器鎖,同一程序中假如有多個執行緒執行,一個執行緒在執行python程式的時候會霸佔python直譯器(加了一把鎖即GIL),使該程序內的其他執行緒無法執行,等該執行緒執行完後其他執行緒才能執行。如果執行緒執行過程中遇到耗時操作,則直譯器鎖解開,使其他執行緒執行。所以在多執行緒中,執行緒的執行仍是有先後順序的,並不是同時進行。

多程序中因為每個程序都能被系統分配資源,相當於每個程序有了一個python直譯器,所以多程序可以實現多個程序的同時執行,缺點是程序系統資源開銷大

7.python實現列表去重的方法

a=[1,2,3,4,1,2,3]
tmp=list(set(a))
print(tmp)

輸出

macname@MacdeMBP ~ % python3 test.py
[1, 2, 3, 4]
macname@MacdeMBP ~ % 

8.fun(*args,**kwargs)中的*args,**kwargs什麼意思?

def test(*args,**kwargs):
    print(args)
    print(kwargs)

test("a","b","c",d="aaa")

輸出

macname@MacdeMBP ~ % python3 test.py
('a', 'b', 'c')
{'d': 'aaa'}
macname@MacdeMBP ~ % 


9.python2和python3的range(100)的區別
python2返回列表,python3返回迭代器,節約記憶體


10.一句話解釋什麼樣的語言能夠用裝飾器?
函式可以作為引數傳遞的語言,可以使用裝飾器

11.python內建資料型別有哪些
整型--int

布林型--bool

字串--str

列表--list

元組--tuple

字典--dict

12.簡述with方法開啟處理檔案幫我們做了什麼?

開啟檔案在進行讀寫的時候可能會出現一些異常狀況,如果按照常規的f.open

寫法,我們需要try,except,finally,做異常判斷,並且檔案最終不管遇到什麼情況,都要執行finally f.close()關閉檔案,with方法幫我們實現了finally中f.close

(當然還有其他自定義功能,有興趣可以研究with方法原始碼)

13.列表[1,2,3,4,5],請使用map()函式輸出[1,4,9,16,25],並使用列表推導式提取出大於10的數,最終輸出[16,25]

map()函式第一個引數是fun,第二個引數是一般是list,第三個引數可以寫list,也可以不寫,根據需求