Python部分
一、 __new__.__init__區別,如何實現單例模式,有什麼優勢
__new__是一個靜態方法,__init__是一個實例方法
__new__返回一個建立的實例,__init__什麼都不返回
__new__返回一個cls的實例時後面的__init__才能被調用
當建立一個新實例時調用__new__,初始化一個實例時調用__init__
二、深淺拷貝
淺拷貝只是增長了一個指針指向一個存在的地址,而深拷貝是增長一個指針而且開闢了新的內存,這個增長的指針指向這個新的內存,
採用淺拷貝的狀況,釋放內存,會釋放同一內存,深拷貝就不會出現釋放同一內存的錯誤
三、HTTP/IP相關協議,分別位於哪層
http協議是超文本傳輸協議,http協議是基於TCP/IP通訊協議來傳遞數據
http協議工做於c/s架構上,瀏覽器做爲http的客戶端經過URL向http服務端即web服務器發送全部請求。web服務器收到全部請求後,向客戶端發送響應信息,http特色是短鏈接,無狀態
地址欄輸入URL,按下回車以後經歷了什麼?
1.瀏覽器向DNS服務器請求解析該URL中的域名所對應的IP地址
2.解析出IP地址後,根據IP地址和默認端口80,和服務器創建TCP鏈接
3.瀏覽器發出讀取文件的http請求,該請求報文做爲TCP三次握手的第三個報文的數據發送給服務器
4.服務器對瀏覽器請求作出響應,並把對應的html文件發送給瀏覽器
5.釋放TCP鏈接
6.瀏覽器將該HMTL渲染並顯示內容
四、TCP/UDP區別
TCP協議是面向鏈接,保證高可靠性(數據無丟失,數據無失序,數據無錯誤,數據無重複達到)傳輸層協議
UDP:數據丟失,無秩序的傳輸層協議(qq基於udp協議)
五、webscoket
websocket是基於http協議的,可持續化鏈接
輪詢:瀏覽器每隔幾秒就發送一次請求,詢問服務器是否有新消息
長輪詢:客戶端發起鏈接後,若是沒有消息,就一直不返回response給客戶端,直到有消息返回,返回完以後,客戶端再次發起鏈接
六、RabbitMQ:
服務器端有Erlang語言來編寫,支持多種客戶端,只會ajax,用於分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性的方面不俗。
connection是RabbitMQ的socket鏈接,它封裝了socket部分相關協議邏輯
connectionFactroy爲connection的製造工廠
channel是咱們與RabbitMQ打交道的最重要的一個接口,大部分的業務操做是在chaanel這個接口中完成,包括定義Queue、定義Exchange、
綁定Queue與Exchange,發佈消息等
七、裝飾器
調用裝飾器實際上是一個閉包函數,爲其餘函數添加附加功能,不修改被修改的源代碼和不修改被修飾的方式,裝飾器的返回值也是一個函數對象。
好比:插入日誌、性能測試、事物處理、緩存、權限驗證等,有了裝飾器,就能夠抽離出大量與函數功能自己無關的雷同代碼並繼續重用。
八、閉包
1.必須有一個內嵌函數
2.內嵌函數必須引用外部函數的變量(該函數包含對外做用域而不是全局做用域名字的引用)
3.外部函數的返回值必須是內嵌函數
九、迭代器與生成器
迭代可迭代對象對應_iter_(方法)和迭代器對應_next_(方法)的一個過程
生成器:包括含有yield這個關鍵字,生成器也是迭代器,調動next把函數變成迭代器。
十、classmethod,staticmethod,property
類方法:將類的函數轉換成類方法,函數上裝飾@classmethod會將函數的自動傳值參數改爲cls
靜態方法:此方法至關於給類擴展一個功能,將類內的函數實例化,給類或對象使用,此時類內的函數就是普通函數,不論是類仍是實例化的對象均可以使用
實例化:類的實例化就會產生一個實例(對象),能夠理解爲類()把虛擬的東西實例化,獲得具體存在的值
十一、經常使用的狀態碼
200--服務器成功返回網頁
204--請求收到,但返回信息爲空
304--客戶端已經執行了GET,但文件未變化
400--錯誤請求,如語法錯誤
403--無權限訪問
404--請求的頁面不存在
500--服務器產生內部錯誤
十二、多進程,多線程,協程,GIL
GIL:全局解釋器鎖,是鎖在cpython解釋器上,致使同一時刻,同一進程只能有一個線程被執行
多進程:多進程模塊multiprocessing來實現,cpu密集型,IO計算型能夠用多進程
多線程:多線程模塊threading來實現,IO密集型,多線程能夠提升效率
協程:依賴於geenlet,對於多線程應用。cpu經過切片的方式來切換線程間的執行,遇到IO操做自動切換,線程切換時須要耗時,而協成好處沒有切換的消耗,沒有鎖定概念。
進程:是資源管理單位,進程是相互獨立的,實現併發和併發
線程:是最小的執行單位,線程的出現爲了下降上下文切換的消耗,提供系統的併發性
1三、IO多路複用/異步非阻塞
IO多路複用:經過一種機制,能夠監聽多個描述符 select/poll/epoll
select:鏈接數受限,查找配對速度慢,數據由內核拷貝到用戶態
poll:改善了鏈接數,可是仍是查找配對速度慢,數據由內核拷貝到用戶態
epoll:epoll是linux下多路複用IO接口,是select/poll的加強版,它能顯著提升程序在大量併發鏈接中只有少許活躍的狀況下的系統CPU利用率
異步非阻塞:異步體如今回調上,回調就是有消息返回時告知一聲兒進程進行處理。非阻塞就是不等待,不須要進程等待下去,繼續執行其餘操做,無論其餘進程的狀態。
1四、PEP8規範,規範的好處是什麼?
1.縮進:4個空實現縮進,儘可能不使用Tab
2.行:沒行最大長度不超過79,換行可使用反斜槓
3.命名規範:
4.註釋規範:
1五、range-and-xrange
都在循環時使用,xrange內存性能更好,xrange用法與range徹底相同,range一個生成list對象,xrange是生成器
1六、with上下文機制原理
_enter_和_exit_,上下文管理協議,即with語句,爲了讓一個對象兼容with語句,必須在這個對象類中聲明_enter_和_exit_方法,
使用with語句的目的就是把代碼塊放入with中執行,with結束後,自動完成清理工做,無須受到干預
1七、經典類、新式類
經典類遵循:深度優先,python2中
新式類遵循:廣度優先,Python3中
1八、有沒有一個工具能夠幫助查找Python的bug和進行靜態的代碼分析?
PyChecker是一個Python代碼的靜態分析工具,它能夠幫助查找Python代碼的bug,會對代碼的複雜度和格式提出警告,
Pylint是另一個工具能夠進行codingstandard檢查
1九、 Python是如何進行內存管理的
1.對象引用計數:
引用計數增長的狀況:
來保持追蹤內存中的對象,全部對象都用引用計數,一個對象分配一個新名稱
將其放入一個容器中(列表,字典,元祖)
引用計數減小的狀況:
使用del語句對對象別名顯示的銷燬
引用超出做用域或被從新賦值
sys.getrefcount()函數能夠得到對象的當前引用計數
2.標記-清除機制
3.分代技術
20、什麼是python?使用python有什麼好處?
python是一種編程語言,它有對象、模塊、線程、異常處理和自動內存管理。它簡潔,簡單、方便、容易擴展、有許多自帶的數據結果,並且它開源
2一、什麼是pickling和unpickling?
Pickle模塊讀入任何python對象,將它們轉換成字符串,而後使用dump函數將其轉儲到一個文件中——這個過程叫作pickling
反之從存儲的字符串文件中提取原始python對象的過程,叫作unpickling
2二、python是如何被解釋的?
Python是一種解釋性語言,它的源代碼能夠直接運行,Python解釋器會將源代碼轉換成中間語言,以後再翻譯成機器碼再執行
2三、數組和元祖之間的區別是什麼?
數組和元祖之間的區別:數組內容能夠被修改,而元祖內容是隻讀的,不可被修改的,另外元祖能夠被哈希,好比做爲字典的key
2四、參數按值傳遞和引用傳遞是怎麼實現的?
python中的一切都是類,全部的變量都是一個對象的引用。引用的值是由函數肯定的,所以沒法被改變,可是若是一個對象是能夠被修改的,你能夠改動對象
2五、Python都有哪些自帶的數據結構?
Python自帶的數據結構分爲可變和不可變的:可變的有:數組、集合、字典,不可變的是:字符串、元祖、整數
2六、什麼是python的命名空間?
在python中,全部的名字都存在於一個空間中,它們在該空間中存在和被操做——這就是命名空間,它就好像一個盒子,在每一個變量名字都對應裝着一個對象,當查詢變量的時候,會從該盒子裏面尋找相應的對象
2七、python中的unittest是什麼?
在python中,unittest是python中的單元測試框架,它擁有支持共享搭建、自動測試、在測試中暫停代碼、將不一樣測試迭代成一組
2八、*args與**kwargs
*args表明位置參數,它會接收任意多個參數並把這些參數做爲元祖傳遞給函數。**kwargs表明的關鍵字參數,返回的是字典,位置參數必定要放在關鍵字前面
2九、在Python中什麼是slicing?
slicing是一種在有序的對象類型中(數組、元祖、字符串)節選某一段的語法
30、中的docstring是什麼?
Python中文檔字符串被稱爲docstring,它在Python中的做用是爲函數、模塊和類註釋生成文檔
3一、os與sys區別:
os是模塊負責程序與操做系統的交互,提供了訪問操做系統底層的接口
sys模塊是負責程序與python解釋器的交互,提供了一系列的函數和變量,用於操控Python時運行的環境
3二、實現一個單例模式
_new_()在 _init_()以前被調用,用於生成實例對象。利用這個方法和類的屬性的特色能夠實現設計模式的單例模式。
單例模式是指建立惟一對象,單例模式設計的類只能實例,實例化1個對象
class Singleton(object):
__instance=None
def __init__(self):
pass
def __new__(cls, *args, **kwargs):
if Singleton.__instance is None:
Singleton.__instance=object.__new__(cls,*args,**kwargs)
return Singleton.__instance
3三、算法(冒泡排序,選擇排序,插入排序)
冒泡:首先,列表每兩個相鄰的數,若是前面的比後邊的大,
那麼交換這兩個數,代碼關鍵點:趟和無序區,
時間複雜度爲:O(n2)
import random
def dublue_sort(li):
for i in range(len(li)-1):
exchange= False
for j in range(len(li)-i -1):
if li[j] > li[j+1]:
li[j],li[j+1] = li[j+1],li[j]
exchange = True
if not exchange:
return
return li
li=list(range(100))
random.shuffle(li)
print(li)
print(dublue_sort(li))
選擇:一趟遍歷記錄最小的數,放到第一個位置,再一趟遍歷記錄剩餘列表中最小的數,
繼續放置,代碼關鍵點:無序區和最小數的位置,時間複雜度爲:O(n2)
def select_sort(li):
for i in range(len(li)-1): #i是趟
min_loc=i
#找i位置到最後位置範圍內最小的數
for j in range(i,len(li)):
if li[j] < li[min_loc]:
min_loc = j
#和無序區第一個數做交換
li[min_loc],li[i] = li[i],li[min_loc]
return li
li=list(range(100))
random.shuffle(li)
print(select_sort(li))
插入:列表被分爲有序區和無序區兩個部分。最初有序區只有一個元素,
每次從無序區選擇一個元素,插入到有序區的位置,直到無序區變空,
代碼關鍵點:摸到的牌和手裏的牌,時間複雜度爲:O(n2)
def insert_sort(li):
for i in range(1,len(li)): #i 表明每次摸到的牌的下標
tmp=li[i]
j = i-1 # j表明手裏最後一張牌的下標
while True:
if j < 0 or tmp >= li[j]:
break
li[ j + 1] = li [j]
j -=1
li[j+1] = tmp
li=list(range(100))
print(insert_sort(li))
二分:列表查找:從列表中查找指定元素,輸入:列表、待查找元素,輸出:元素下標或未查找到元素。
二分查找,從有序列表的候選區data[0:n]開始,經過對待查找的值與候選區中間值的比較,
可使候選區減小一半。時間複雜爲:O(logn)
def bin_search(data,val):
low=0
high=len(data)-1
while low <= high :
mid= (low+high) //2
if data[mid] == val:
return mid
elif data[mid] < high :
low = mid + 1
else:
high = mid - 1
return None
print(bin_search([1,2,3,4,5,6,7,8],4))
====================================================================
添加:
1.簡述epoll和select的區別
2.請你談談對restful API的設計規範的見解,主要遵循哪些原則?
按照方法來記
請求類:
1.url
https--->url版本和過濾--->資源
2.請求頭
method
響應類:
狀態碼,出錯,不一樣方式訪問返回結果不一樣等等
3.談談面向對象而且解釋廣度優先和深度優先解釋
4.經典類和新式類
5.pyc是什麼東西
pyc文件就是 py程序編譯後獲得的字節碼文件 (py->pyc)