1. 程式人生 > >python面試的基礎知識總結

python面試的基礎知識總結

自己總結的面試中大概率被問到的知識,經驗就是王道

1.utf-8中中文佔幾個位元組

  • unicode 萬國碼 支援所有國家語言是編碼字符集 Utf-8 可變位元組碼 中文大多數佔3個位元組 超大字元佔4個字元 GBK、gb2312中文 佔兩個位元組

2.如何在不使用第三個變數的情況下,將a,b的值進行交換

第一種方法
a=1, b=2 
a = a+b
b = a-b
a = a-b

第二中方法
a=1, b=2
a,b = b,a

3.如何快速的將兩個列表轉化成一個字典

In [3]: a = [1,2,3]

In [4]: b =[11,22,33]

In [5]: c = dict(zip(a,b))

In [6]: c
Out[6]: {1: 11, 2: 22, 3: 33}

4.怎麼理解python中的引用

在python中,值是靠引用來傳遞的,引用是是指向一個記憶體起始地址的。

5.匿名函式的意義

當寫一段簡單的程式碼時,可以用匿名函式來寫。好處時,傳遞不同的匿名函式,可以出執行不同的效果。

6.面向函式的三大特性

封裝:一個函式一個功能,類是相關函式的集合。根據職責的不同將屬性和方法封裝到一個類裡。
繼承:這是設計類的技巧,父與子。主要體現了去除重複性程式碼。子類可以呼叫父類的方法。私有的除外。
多型:不同的子類物件呼叫相同的父類方法會執行出不同的效果來。在保證安全的前提下,提高了方法呼叫的靈活性。是以繼承和重寫父類的方法為基礎的。

7.兩個函式之間如何實現資料的共享

第一種:全域性變數的方法
第二種:return返回值

8.簡單描述tcp與udp的不同

1. TCP: 傳輸控制協議, 面向連線可靠的傳輸協議, Transmission Control Protocol
2. UDP: 使用者資料報協議, 不面向連線不能保證資料的可靠性,但是傳輸速度快,佔用資源少,User Datagram Protocol
3. TCP的特點:
    3.1 面向連線, 間接驗證ip地址有效性
    3.2 可靠的傳輸
        3.2.1 應答機制:對方收到訊息,底層會回覆
        3.2.2 超時重傳:對方收到資料沒有回覆那麼會再次給對方傳送資料,如果對方一直不回覆那麼會認為對方掉線
        3.2.3 錯誤校驗:比如接收的資料的序號和傳送時候的資料序號不一致,那麼tcp會對資料包進行自動排序, 如果收到重複的資料包會刪除
        3.2.4 流量控制:對方傳送大量資料如果接收方網絡卡快取區達到一定上限,那麼就不讓對方傳送資料,等接收方把資料處理完以後再發送,保證電腦接收資料不會卡死
4. TCP和UDP的不同點
    4.1 tcp面向連線, udp不面向連線
    4.2 tcp可靠的傳輸協議,udp 不可靠
    4.3 tcp 應答機制, udp沒有
    4.4 tcp 超時重傳,udp沒有
    4.5 tcp 流量控制, udp沒有
    4.6 tcp 錯誤校驗, udp沒有
    4.7 udp 適合做廣播, tcp不適合
    4.8 udp傳輸速度比tcp傳輸速度要快, udp佔用的資源要比tcp的佔用資源要少
    4.9 udp 每次傳送的資料包不能太大,上限是64k, tcp理論上沒有限制 —擴充套件
    4.10 tcp適合檔案的上傳和下載,絕大多數應用都是使用tcp的
    4.11 udp 適合音視訊(qq,微信)的傳輸,還有飛秋上線廣播

9. 網路中的四層或七層協議

四層:
    應用層
    傳輸層--udp,tcp
    網路層--arp(通過ip找mac地址),rarp(根據mac地址找ip),ip,icmp(ping 一個主機時 會用到的協議)
    鏈路層
七層:
    應用層
    展示層
    會話層
    傳輸層
    網路層
    物理鏈路層
    物理層

10.解釋一下tcp中的三次握手和四次揮手

三次握手

第一次:客戶端傳送SYN(標誌位為1的連線請求),和seq=j的報文序號給服務端,等待確認
第二次:服務端收到客戶端發來的資料後,回給一個SYN(標誌位為1的連線請求)和seq = k,  並返回ACK( 標誌位為1)和ack = j+1的確認值用來同意是seq=j發來的請求
第三次:客戶端收到後,通過返回的ack的值來判斷是否為自己傳送的連線請求,並返回ACK和ack=k+1的值來同意建立連線,服務端確認ACK的值k+1是否正確, 若正確則此時才可以傳送資料

四次揮手

第一次:客戶端傳送一個FIN(標誌位為1)和seq=j的報文序號的關閉請求,等待確認
第二次:服務端收到後,返回ACK(標誌位為1)和 ack = j+1的確認值給客戶端。並告訴說,服務端處理完後再關閉連線
第三次:服務端再次想客戶端傳送一個FIN(標誌位 為1 )和seq=k,的關閉請求,說明已經處理完,可以關閉連線
第四次:客戶端接收 到ACK後,確認為自己傳送的請求後,傳送給服務端ACK(標誌位1)和ack = k+1的確認,說明同意斷開。此時斷開連線

11.執行緒、程序、協程之間的區別

執行緒是cup排程的基本單位,程序是系統分配資源的基本單位。程序之間是相互獨立的,執行緒則不是。協程是在不開闢執行緒的情況下執行多工。
Ⅰ: 先有程序,程序裡預設有一條執行緒,可以建立多個執行緒,執行緒裡可以包含多個協程,都是用來完成多工的。協程需要的資源最少大概只有5k,執行緒大概512k,程序則需要更多。
Ⅱ: 程序是不共享全域性變數的,執行緒和協程共享全域性變數。但線上程中共享全域性變數中需要注意資料的競爭和資料不準確,則在使用的時候有兩種方法 1:執行緒等待(用join),又叫執行緒同步。2:互斥鎖( lock = threading.Lock() )方法來加鎖,能保證同一時刻只有一個執行緒去執行任務。當然這種情況會使效能下降。
Ⅲ:多程序開發要比單程序多執行緒開發穩定,但是消耗資源也大。
Ⅳ: 多程序、多執行緒之間執行任務時無序的,而協程是按照一定的順序執行的。

12.GIL是什麼,怎麼解決這個問題

叫什麼:全域性直譯器鎖--在cpython中
有什麼用:單核的情況下實現多工
怎麼解決:
    換直譯器鎖jpython
    程序加協程(個人建議)
    執行緒用其他語言實現,python呼叫
現在的影響:因為當時吉多在設計的時候還是單核cpu,用GIL來實現單核的情況下執行多工。但現在都是多核處理器,當用多執行緒的時候,多核cpu達不到多核的效果,因為GIL會保證同一時刻只有一個執行緒能使用到cpu,導致了不能完全利用cpu。

13.擴充套件知識

有三框水果。有一筐全是蘋果一筐全是橘子還有一筐是兩種水果的混合。三框都分別標記了“蘋果”“橘子”“混合”。但是標籤全是錯的即標籤是什麼裡面就一定不是那框水果。你的任務是如何只把手伸進一個框子中只拿出一個水果然後準確的把三框水果的標籤改正確。
答案:把手伸進標記為混合的框子裡。因為都是錯的,所以標記為混合的框裡肯定裝的只是一種水果,那麼拿出是什麼水果就是應該標記什麼水果。之後剩下兩個框子,你已經確認的框中是什麼水果,那麼對應的標記框子內的水果是混合的,剩下一個就是另一種水果的