1. 程式人生 > 實用技巧 ><面試題>面試題整理(101-200)

<面試題>面試題整理(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,
那麼該物件就可以被垃圾回收。不過如果出現迴圈引用的話,引用計數機制就不再起有效的作用了

2. 標記清除
如果兩個物件的引用計數都為 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)