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,也可以不寫,根據需求