<面試題>面試題整理(101-200)
101.描述用瀏覽器訪問 www.baidu.com 的過程
先要解析出 baidu.com 對應的 ip 地址
要先使用 arp 獲取預設閘道器的 mac 地址
組織資料傳送給預設閘道器(ip 還是 dns 伺服器的 ip,但是 mac 地址是預設閘道器的 mac 地址)
預設閘道器擁有轉發資料的能力,把資料轉發給路由器
路由器根據自己的路由協議,來選擇一個合適的較快的路徑轉發資料給目的閘道器
目的閘道器(dns 伺服器所在的閘道器),把資料轉發給 dns 伺服器
dns 伺服器查詢解析出 baidu.com 對應的 ip 地址,並原路返回請求這個域名的 client
得到了 baidu.com 對應的 ip 地址之後,會發送 tcp 的 3 次握手,進行連線
使用 http 協議傳送請求資料給 web 伺服器
web 伺服器收到資料請求之後,通過查詢自己的伺服器得到相應的結果,原路返回給瀏覽器。
瀏覽器接收到資料之後通過瀏覽器自己的渲染功能來顯示這個網頁。
瀏覽器關閉 tcp 連線,即 4 次揮手結束,完成整個訪問過程
102.Python 函式呼叫的時候引數的傳遞方式是值傳遞還是引用傳遞
不可變引數用值傳遞:
像整數和字串這樣的不可變物件,是通過拷貝進行傳遞的,因為你無論如何都不可能在原處改變
不可變物件
可變引數是引用傳遞的:
比如像列表,字典這樣的物件是通過引用傳遞、和 C 語言裡面的用指標傳遞陣列很相似,可變物件
能在函式內部改變。
103.Python 的記憶體管理機制及調優手段?
記憶體管理機制:引用計數、垃圾回收、記憶體池。
引用計數:
引用計數是一種非常高效的記憶體管理手段, 當一個 Python 物件被引用時其引用計數增加 1, 當
其不再被一個變數引用時則計數減 1. 當引用計數等於 0 時物件被刪除。
垃圾回收 :
1. 引用計數
引用計數也是一種垃圾收集機制,而且也是一種最直觀,最簡單的垃圾收集技術。當 Python 的某
個物件的引用計數降為 0 時,說明沒有任何引用指向該物件,該物件就成為要被回收的垃圾了。比如
某個新建物件,它被分配給某個引用,物件的引用計數變為 1。如果引用被刪除,物件的引用計數為 0,
那麼該物件就可以被垃圾回收。不過如果出現迴圈引用的話,引用計數機制就不再起有效的作用了
如果兩個物件的引用計數都為 1,但是僅僅存在他們之間的迴圈引用,那麼這兩個物件都是需要被
回收的,也就是說,它們的引用計數雖然表現為非 0,但實際上有效的引用計數為 0。所以先將迴圈引
用摘掉,就會得出這兩個物件的有效計數。
3. 分代回收(多次沒清除的保留,下次不回收這些內容)
從前面“標記-清除”這樣的垃圾收集機制來看,這種垃圾收集機制所帶來的額外操作實際上與系統
中總的記憶體塊的數量是相關的,當需要回收的記憶體塊越多時,垃圾檢測帶來的額外操作就越多,而垃圾
回收帶來的額外操作就越少;反之,當需回收的記憶體塊越少時,垃圾檢測就將比垃圾回收帶來更少的額
外操作。
記憶體池:
1. Python 的記憶體機制呈現金字塔形狀,-1,-2 層主要有作業系統進行操作;
2. 第 0 層是 C 中的 malloc,free 等記憶體分配和釋放函式進行操作;
3. 第 1 層和第 2 層是記憶體池,有 Python 的介面函式 PyMem_Malloc 函式實現,當物件小於
256K 時有該層直接分配記憶體;
4. 第 3 層是最上層,也就是我們對 Python 物件的直接操作;
Python 在執行期間會大量地執行 malloc 和 free 的操作,頻繁地在使用者態和核心態之間進行切
換,這將嚴重影響 Python 的執行效率。為了加速 Python 的執行效率,Python 引入了一個記憶體池
機制,用於管理對小塊記憶體的申請和釋放。
Python 內部預設的小塊記憶體與大塊記憶體的分界點定在 256 個位元組,當申請的記憶體小於 256 位元組
時,PyObject_Malloc 會在記憶體池中申請記憶體;當申請的記憶體大於 256 位元組時,PyObject_Malloc 的
行為將蛻化為 malloc 的行為。當然,通過修改 Python 原始碼,我們可以改變這個預設值,從而改
變 Python 的預設記憶體管理行為
104.字典按照值排序
d = {'a': 3, 'b': 1, 'c': 2, 'd': 4} # 有返回值 d_reverse = sorted(d.items(), key=lambda x:x[1], reverse=True) d_sorted = sorted(d.items(), key=lambda x:x[1], reverse=False) print(d_reverse,d_sorted)
105.輸入某年某月某日,判斷這一天是這一年的第幾天?
# 今年的第幾天 import datetime year = int(input("請輸入年份:")) month = int(input("請輸入月份:")) day = int(input("請輸入天數:")) data1 = datetime.date(year=year, month=month, day=day) data2 = datetime.date(year=year, month=1, day=1) result = data1 - data2 # <class 'datetime.timedelta'> 1 day, 0:00:00 result = result.days + 1 print(result)
106.簡述你對 input()函式的理解?
在 Python3 中,input()獲取使用者輸入,不論使用者輸入的是什麼,獲取到的都是字串型別的。
在 Python2 中,input()獲取使用者輸入,不論使用者輸入的是什麼,獲取到的就是什麼資料型別的。
107.閱讀下面的程式碼,寫出 A0,A1 至 An 的最終值。
詳情見:https://www.cnblogs.com/shuimohei/p/10232668.html
108.補充缺失的程式碼?
https://www.cnblogs.com/shuimohei/p/10232473.html
109.程序
程序:程式執行在作業系統上的一個例項,就稱之為程序。程序需要相應的系統資源:記憶體、時間
片、pid。
https://www.cnblogs.com/shuimohei/p/10500266.html
https://www.cnblogs.com/shuimohei/p/10500299.html
110.下面這段程式碼的輸出結果將是什麼?請解釋?
class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass # 繼承指向父類x所在地址:1635999904 print(id(Parent.x), id(Child1.x), id(Child2.x)) # 1 1 1 print(Parent.x, Child1.x, Child2.x) Child1.x = 2 # 1 2 1 print(Parent.x, Child1.x, Child2.x) Parent.x = 3 # 3 2 3 print(Parent.x, Child1.x, Child2.x)