面試題彙總(四)

1.請解釋TCP/IP協議

TCP/IP 協議棧是一系列網絡協議的總和,是構成網絡通訊的核心骨架,它定義了電子設備如何連入因特網,以及數據如何在它們之間進行傳輸。TCP/IP 協議採用4層結構,分別是應用層、傳輸層、網絡層和鏈路層,每一層都呼叫它的下一層所提供的協議來完成本身的需求。因爲咱們大部分時間都工做在應用層,下層的事情不用咱們操心;其次網絡協議體系自己就很複雜龐大,入門門檻高,所以很難搞清楚TCP/IP的工做原理,通俗一點講就是,一個主機的數據要通過哪些過程才能發送到對方的主機上。python

 

 

2.請列出你知道的HTTP狀態碼

2開頭 (請求成功)表示成功處理了請求的狀態代碼。3開頭 (請求被重定向)表示要完成請求,須要進一步操做。 一般,這些狀態代碼用來重定向。4開頭 (請求錯誤)這些狀態代碼表示請求可能出錯,妨礙了服務器的處理.

200 (成功)201 (已建立) 202 (已接受) 203 (非受權信息)204 (無內容) 205 (重置內容)206 (部份內容)300 (多種選擇)301 (永久移動)302 (臨時移動)303 (查看其餘位置)304 (未修改)305 (使用代理)307 (臨時重定向)400 (錯誤請求)401 (未受權)403 (禁止)404 (未找到)405 (方法禁用) 406 (不接受) 407 (須要代理受權)408 (請求超時) 409 (衝突) 410 (已刪除)411 (須要有效長度)mysql

 

3.一行代碼實現1-100之和

 

num = sum(range(1,101))

 

 

4.如何在一個函數內部修改去全局變量?

a = 1
def add():
  global a
  a = a + 1
  print(a)
add()

 

 

5.列出5個經常使用Python標準庫

os 操做系統
time 時間
random 隨機
pymysql 鏈接數據庫
threading 線程
multiprocessing 進程
queue 隊列

 

6.如何合併兩個字典

#方法一:
d1 = {'usr':'zhangxin', 'pwd':'123456'}
d2 = {'ip':'127.0.0.1', 'port': '8000'}
d3 = dict(d1, **d2)
print(d3)


#方法二:
d1 = {'usr':'zhangxin', 'pwd':'123456'}
d2 = {'ip':'127.0.0.1', 'port': '8000'}
d3 = {}
d3.update(d1)
d3.update(d2)


#方法三:
d1 = {'usr':'zhangxin', 'pwd':'123456'}
d2 = {'ip':'127.0.0.1', 'port': '8000'}
d3 = {}
for k, v in d1.items():
   d3[k] = v
for k, v in d2.items():
   d3[k] = v

print(d3)
print(d3)

 

 

7.Python實現列表去重的方法?

li = [1, 2, 3, 4, 1, 2]
s = set(li)
li = list(s)
print(li)

 

 

8.實現一個單例模式

#方法一:__new__
class Borg(object):
   def __new__(cls, *args, **kwargs):
       if not hasattr(cls, '_instance'):
           ob = super(Borg, cls)
           cls._instance = ob.__new__(cls, *args, **kwargs)
       return cls._instance

class MyClass(Borg):
   def __init__(self):
       self.a = 1

if __name__ == '__main__':
   a1 = MyClass()
   a2 = MyClass()

   a1.a = 10
   print(a1.a)
   print(a2.a)
   print(a1.__dict__)
   
   
   
   
#方法二:共享模式
class Borg2(object):
   _state = {}

   def __new__(cls, *args, **kwargs):
       ob = super(Borg2, cls).__new__(cls, *args, **kwargs)
       ob.__dict__ = cls._state
       return ob

class MyClass(Borg2):
   def __init__(self):
       self.a = 1


if __name__ == '__main__':
   a1 = MyClass()
   a2 = MyClass()

   a1.a = 10
   print(a1.a)
   print(a2.a)
   print(a1.__dict__)

 

 

9.寫一段自定義異常代碼

 

class FError(Exception):
   pass

try:
   raise FError("自定義異常")
   except FError as e:
   print(e)

 

 

10.簡述多線程, 多進程

進程是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。或者說進程是具備必定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。 線程則是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。sql

 

進程和線程的關係:

(1)一個線程只能屬於一個進程,而一個進程能夠有多個線程,但至少有一個線程。數據庫

(2)資源分配給進程,同一進程的全部線程共享該進程的全部資源。安全

(3)CPU分給線程,即真正在CPU上運行的是線程。服務器

 

11.談一下python的GIL

GIL的全稱是Global Interpreter Lock(全局解釋器鎖),來源是python設計之初的考慮,爲了數據安全所作的決定。每一個CPU在同一時間只能執行一個線程(在單核CPU下的多線程其實都只是併發,不是並行,併發和並行從宏觀上來說都是同時處理多路請求的概念。但併發和並行又有區別,並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔內發生。) 在Python多線程下,每一個線程的執行方式: 1.獲取GIL 2.執行代碼直到sleep或者是python虛擬機將其掛起。 3.釋放GIL 可見,某個線程想要執行,必須先拿到GIL,咱們能夠把GIL看做是「通行證」,而且在一個python進程中,GIL只有一個。拿不到通行證的線程,就不容許進入CPU執行。網絡

 

12.寫一個函數, 輸入一個字符串, 返回倒序排列的結果: 如: string_reverse('abcdef'), 返回: 'fedcba'(請採用多種方法實現, 並對實現方法進行比較)

 

#1.使用字符串自己的翻轉
def string_reverse1(text='abcdef'):
   return text[::-1]
#2.把字符串變爲列表,用列表的reverse函數
def string_reverse2(text='abcdef'):
   new_text=list(text)
   new_text.reverse()
   return ''.join(new_text)

print string_reverse2('abcdef')
fedcba
#3.新建一個列表,從後往前取
def string_reverse3(text='abcdef'):
   new_text=[]
   for i in range(1,len(text)+1):
       new_text.append(text[-i])
   return ''.join(new_text)

print string_reverse3('abcdef')
fedcba
#4.利用雙向列表deque中的extendleft函數
from collections import deque
def string_reverse4(text='abcdef'):
   d = deque()
   d.extendleft(text)
   return ''.join(d)

print string_reverse4('abcdef')
fedcba
#5.遞歸
def string_reverse5(text='abcdef'):
   if len(text)<=1:
        return text
   else:
       return string_reverse5(text[1:]+text[0])

 

12.一個臺階總共有n級, 若是一次能夠跳1級, 也能夠跳2級, 求總共有多少種跳法.

 

F(1) = 1;
F(2)= 2;
F(n) = F(n-1)+F(n-2);  n>2

 

13.進程和線程的區別是什麼?

進程是一個程序執行的實體. 進程包含的資源有:代碼, 公有數據, 進程控制塊(pid, 軟硬件資源) 進程的提點是佔用內存空間較大, 上下文切換速度慢多線程

線程是一個程序的執行路徑(一個函數) 線程包含的資源有:函數代碼, 私有數據, 線程控制塊, 線程特色是佔用內存空間小, 上下文切換速度快併發

 

 

1.地址空間和其餘資源(如打開文件):進程間相互獨立,同一進程的各線程間共享。某進程內的線程在其餘進程內不可見。 2.通訊:進程間通訊IPC(管道,信號量,共享內存,消息隊列),線程間能夠直接獨寫進程數據段(如全局變量)來進程通訊——須要進程同步和互斥手段的輔助,以保證數據的一致性。 3.調度和切換:線程上下文切換比進程上下文切換快得多。 4.在多線程OS中,進程不是一個可執行的實體。app

 

 

 

14.進程間的通訊機制有哪些?

1.python提供了多種進程通訊方式, 主要Queue和Pipe這兩種方式, Queue用於多個進程間實現通訊, Pipe是兩個進程的通訊 1.1 Queue有兩個方法: Put方法:以插入數據到隊列中,他還有兩個可選參數:blocked和timeout。詳情自行百度 Get方法:從隊列讀取而且刪除一個元素。一樣,他還有兩個可選參數:blocked和timeout。詳情自行百度 1.2 Pipe通訊機制,

  • Pipe經常使用於兩個進程,兩個進程分別位於管道的兩端

  • Pipe方法返回(conn1,conn2)表明一個管道的兩個端,Pipe方法有duplex參數,默認爲True,即全雙工模式,若爲FALSE,conn1只負責接收信息,conn2負責發送,

  • send和recv方法分別爲發送和接收信息

 

15.請描述TCP和UDP的區別

TCP與UDP區別總結: 一、TCP面向鏈接(如打電話要先撥號創建鏈接);UDP是無鏈接的,即發送數據以前不須要創建鏈接;

  1. TCP提供可靠的服務, 也就是說, 經過TCP鏈接傳送的數據, 無差錯, 不丟失, 不重複, 且按序到達; UDP盡最大努力交付, 既不保證可靠交付;

  2. TCP面向字節流, 其實是TCP把數據堪稱一連串無結構的字節流;UDP是面向報文的;UDP沒有擁塞控制, 所以網絡出現擁塞不會使源主機的發送速率下降(對實時應用頗有用, 如IP電話, 實時視頻會議等);

  3. 每一條TCP鏈接只能是點到點的;UDP支持一對一, 一對多, 多對一和多對多的交互通訊;

  4. TCP首部開銷20字節;UDP的首部開銷小, 只有8個字節;

  5. TCP的邏輯通訊信道是全雙工的可靠信道, UDP則是不可靠信道

相關文章
相關標籤/搜索