python 部分 前端
1.爲何學習pythonpython
python簡單易學,從人性角度講,Python是給人設計的mysql
語法優美,linux
有豐富強大的庫,程序員
開發效率高【可以知足互聯網快速迭代的需求】,web
應用領域防範正則表達式
可嵌入性和可移植性算法
2.經過什麼途徑學習的pythonsql
網絡視頻,數據庫
購買書籍,如流暢的python
技術軟件,掘金,藍鯨,Github
3.Python和Java、PHP、C、C#、C++等其餘語言的對比
Python VS C#
1. Python跨平臺,能夠運行在linux、weindows等平臺
2. Pythond開源,C#則相反
3. Python是解釋型語言,C#須要編譯,因此Python運行要慢點
Python VS Java
Python更簡潔,Java過於龐大複雜,語法不少
Python VS C C++
Python更容易學習,語法簡單易懂,但他們一般扮演不一樣的角色,Python是一種腳本語言,C和C++一般要和底層硬件打交道
Python VS Ruby和Perl
與ruby不一樣,OOP(Object Oriented Programming,面向對象開發)對於Python是可選的,因此Python不會強制用戶選擇
OOP開發
Python一般是上述語言不錯的替代品,使用Python將會減小不少編寫,調試和維護的麻煩
4.簡述解釋型和編譯型編程語言?
編譯型:
將代碼一次性所有編譯成二級制,而後再運行。
優勢:執行效率高。
缺點:開發效率慢,不能跨平臺。
表明語言:C。
解釋型:
代碼逐行解釋,解釋稱二進制,而後運行。
優勢:開發效率高,能夠跨平臺。
缺點:執行效率低。
表明語言:python.
5.Python解釋器種類以及特色?
CPython
CPython。這個解釋器是用C語言開發的,
CPython是使用最廣的Python解釋器。
IPython
IPython是基於CPython之上的一個交互式解釋器,也就是說,IPython只是在交互方式上有所加強,可是執行Python代碼的功能和CPython是徹底同樣的
PyPy
pyPy是另外一個Python解釋器,它的目標是執行速度。PyPy採用JIT技術,對Python代碼進行動態編譯(注意不是解釋),因此能夠顯著提升Python代碼的執行速度。
JPython
Jython是運行在Java平臺上的Python解釋器,能夠直接把Python代碼編譯成Java字節碼執行。
IronPython
IronPython和Jython相似,只不過IronPython是運行在微軟.Net平臺上的Python解釋器,能夠直接把Python代碼編譯成.Net的字節碼。
6.位和字節的關係
1字節Byte=8位(bit),1K=1024字節
7. b、B、KB、MB、GB 的關係?
8bit = 1Byte
1024Bytes = 1KB
1024KB = 1MB
1024MB = 1GB
8. 請至少列舉5個 PEP8 規範(越多越好)
一 代碼編排
1 縮進。4個空格的縮進(編輯器均可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
2 每行最大長度79,換行可使用反斜槓,最好使用圓括號。換行點要在操做符的後邊敲回車。
3 類和top-level函數定義之間空兩行;類中的方法定義之間空一行;函數內邏輯無關段落之間空一行;其餘地方儘可能不要再空行。
二 文檔編排
1 模塊內容的順序:模塊說明和docstring—import—globals&constants—其餘定義。其中import部分,又按標準、三方和本身編寫順序依次排放,之間空一行。
2 不要在一句import中多個庫,好比import os, sys不推薦。
3 若是採用from XX import XX引用庫,能夠省略‘module.’,都是可能出現命名衝突,這時就要採用import XX。
三 空格的使用
整體原則,避免沒必要要的空格。
1 各類右括號前不要加空格。
2 逗號、冒號、分號前不要加空格。
3 函數的左括號前不要加空格。如Func(1)。
4 序列的左括號前不要加空格。如list[2]。
5 操做符左右各加一個空格,不要爲了對齊增長空格。
6 函數默認參數使用的賦值符左右省略空格。
7 不要將多句語句寫在同一行,儘管使用‘;’容許。
8 if/for/while語句中,即便執行語句只有一句,也必須另起一行。
四 註釋
整體原則,錯誤的註釋不如沒有註釋。因此當一段代碼發生變化時,第一件事就是要修改註釋!
註釋必須使用英文,最好是完整的句子,首字母大寫,句後要有結束符,結束符後跟兩個空格,開始下一句。
若是是短語,能夠省略結束符。
1 塊註釋,在一段代碼前增長的註釋。在‘#’後加一空格。段落之間以只有‘#’的行間隔。好比:
# Description : Module config.
#
# Input : None
# Output : None
2 行註釋,在一句代碼後加註釋。好比:x = x + 1 # Increment x
可是這種方式儘可能少使用。
3 避免無謂的註釋。
五 文檔描述
1 爲全部的共有模塊、函數、類、方法寫docstrings;非共有的沒有必要,可是能夠寫註釋(在def的下一行)。
2 若是docstring要換行,參考以下例子,詳見PEP 257
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""
六 命名規範
整體原則,新編代碼必須按下面命名風格進行,現有庫的編碼儘可能保持風格。
1 儘可能單獨使用小寫字母‘l’,大寫字母‘O’等容易混淆的字母。
2 模塊命名儘可能短小,使用所有小寫的方式,可使用下劃線。
3 包命名儘可能短小,使用所有小寫的方式,不可使用下劃線。
4 類的命名使用CapWords的方式,模塊內部使用的類採用_CapWords的方式。
5 異常命名使用CapWords+Error後綴的方式。
6 全局變量儘可能只在模塊內有效,相似C語言中的static。實現方法有兩種,一是__all__機制;二是前綴一個下劃線。
7 函數命名使用所有小寫的方式,可使用下劃線。
8 常量命名使用所有大寫的方式,可使用下劃線。
9 類的屬性(方法和變量)命名使用所有小寫的方式,可使用下劃線。
9 類的屬性有3種做用域public、non-public和subclass API,能夠理解成C++中的public、private、protected,non-public屬性前,前綴一條下劃線。
11 類的屬性若與關鍵字名字衝突,後綴一下劃線,儘可能不要使用縮略等其餘方式。
12 爲避免與子類屬性命名衝突,在類的一些屬性前,前綴兩條下劃線。好比:類Foo中聲明__a,訪問時,只能經過Foo._Foo__a,避免歧義。若是子類也叫Foo,那就無能爲力了。
13 類的方法第一個參數必須是self,而靜態方法第一個參數必須是cls。
七 編碼建議
1 編碼中考慮到其餘python實現的效率等問題,好比運算符‘+’在CPython(Python)中效率很高,都是Jython中卻很是低,因此應該採用.join()的方式。
2 儘量使用‘is’‘is not’取代‘==’,好比if x is not None 要優於if x。
3 使用基於類的異常,每一個模塊或包都有本身的異常類,此異常類繼承自Exception。
4 異常中不要使用裸露的except,except後跟具體的exceptions。
5 異常中try的代碼儘量少。好比:
try:
value = collection[key]
except KeyError:
return key_not_found(key)
else:
return handle_value(value)
要優於
try:
# Too broad!
return handle_value(collection[key])
except KeyError:
# Will also catch KeyError raised by handle_value()
return key_not_found(key)
6 使用startswith() and endswith()代替切片進行序列前綴或後綴的檢查。好比:
Yes: if foo.startswith('bar'):優於
No: if foo[:3] == 'bar':
7 使用isinstance()比較對象的類型。好比
Yes: if isinstance(obj, int): 優於
No: if type(obj) is type(1):
8 判斷序列空或不空,有以下規則
Yes: if not seq:
if seq:
優於
No: if len(seq)
if not len(seq)
9 字符串不要以空格收尾。
10 二進制數據判斷使用 if boolvalue的方式。
9. 經過代碼實現以下轉換:
二進制轉換成十進制:v = 「0b1111011」
int(v,2)
十進制轉換成二進制:v = 18
bin(v)
八進制轉換成十進制:v = 「011」
int(v,8)
十進制轉換成八進制:v = 30
oct(v)
十六進制轉換成十進制:v = 「0x12」
int(v,16)
十進制轉換成十六進制:v = 87
hex(v)
10. 請編寫一個函數實現將IP地址轉換成一個整數。
如 10.3.9.12 轉換規則爲:
10 00001010
3 00000011
9 00001001
12 00001100
再將以上二進制拼接起來計算十進制結果:00001010 00000011 00001001 00001100 = ?
int("".join([bin(int(i)).lstrip("0b").zfill(8) for i in "10.3.9.12".split(".") ]),2)
11.python遞歸的最大層數?
默認最大遞歸層數998
12. 求結果:
v1 = 1 or 3 --1
v2 = 1 and 3 --3
v3 = 0 and 2 and 1 -0
v4 = 0 and 2 or 1 - 1
v5 = 0 and 2 or 1 or 4 -1
v6 = 0 or Flase and 1 -False
13.ascii、unicode、utf-八、gbk 區別?
ASCII:一個Bytes表明一個字符(英文字符/鍵盤上的全部其餘字符),1Bytes=8bit,8bit能夠表示0-2**8-1種變化,便可以表示256個字符
爲了知足中文和英文,中國人定製了GBK
GBK:2Bytes表明一箇中文字符,1Bytes表示一個英文字符
爲了知足其餘國家,各個國家紛紛定製了本身的編碼
日本把日文編到Shift_JIS裏,韓國把韓文編到Euc-kr裏
可以兼容萬國字符
與全世界全部的字符編碼都有映射關係,這樣就能夠轉換成任意國家的字符編碼
這就是unicode(定長), 統一用2Bytes表明一個字符, 雖然2**16-1=65535,但unicode卻能夠存放100w+個字符,
由於unicode存放了與其餘編碼的映射關係,準確地說unicode並非一種嚴格意義上的字符編碼表
很明顯對於通篇都是英文的文原本說,unicode的式無疑是多了一倍的存儲空間(二進制最終都是以電或者磁的方式存儲到存儲介質中的)
因而產生了UTF-8(可變長,全稱Unicode Transformation Format),對英文字符只用1Bytes表示,對中文字符用3Bytes,
對其餘生僻字用更多的Bytes去存
總結:內存中統一採用unicode,浪費空間來換取能夠轉換成任意編碼(不亂碼),
硬盤能夠採用各類編碼,如utf-8,保證存放於硬盤或者基於網絡傳輸的數據量很小,提升傳輸效率與穩定性
14.字節碼和機器碼的區別?
機器碼是電腦CPU直接讀取運行的機器指令,運行速度最快,可是很是晦澀難懂,也比較難編寫,通常從業人員接觸不到。
字節碼是一種中間狀態(中間碼)的二進制代碼(文件)。須要直譯器轉譯後才能成爲機器碼。
15.三元運算規則以及應用場景?
三元運算符就是在賦值變量的時候,能夠直接加判斷,而後賦值
格式:[on_true] if [expression] else [on_false]
resc = 值1 if 條件 else 值2
應用於if--else結構的邏輯,推導式中if也是基於三元運算規則
16.列舉 Python2和Python3的區別?
1.print語句
python2中print是一個語句,輸入內容放在print關鍵字後面便可,
python3裏print是一個函數,須要括號執行,輸出內容做爲參數傳給它
2.默認編碼
python2默認編碼是ASCII碼,不支持中文
python3默認編碼是UTF-8
3.UNICODE字符串
python2中有兩種字符串類型,Unicode字符串和非Unicode字符串
python3中只有一種類型,Unicode字符串
4.全局unicode()方法
python2有兩個全局函數能夠把對象強制轉換成字符串:unicode()把對象轉換成unicode字符串
還有str()把對象轉換爲非Unicode字符串。
Python3只有一種字符串類型,unicode字符串,因此str()函數便可完成全部的功能。
5.long長整型
python2的整數有int整形和long長整型兩種類型
python3裏只有一種整形int
6.比較運算符--不等於
python2支持<>和!=,
python3只支持!=
7.字典類has_key()
python2中有has_key()方法,測試字典是否包含指定的鍵,3不支持
8.HTTP
python3中幾個相關的http模塊被組合成一個單獨的包,即http
9.filter函數
python2中,filter,map方法返回一個列表
python3中,filter,map返回一個迭代器
10.輸入
python2中input等待用戶輸入一個python表達式,而後返回結果
2中raw_input(),用戶輸入什麼就返回什麼
python3中只有input,用戶輸入什麼就返回什麼字符串,不計算
17.用一行代碼實現數值交換:
a = 1
b = 2
a,b = b,a
18. Python3和Python2中 int 和 long的區別?
python2中int有必定範圍,超過範圍的整數要用long型
python3只有int
19. xrange和range的區別?
range產生的是一個列表序列,一次把全部數據返回,
而xrange產生的是一個生成器,每次調用返回其中一個值
相對來講xrange比range性能優化不少,數據集合較大時,不須要開闢一塊很大的內存
20. 文件操做時:xreadlines和readlines的區別?
readlines返回值爲列表,元素爲每行的內容
xreadlines返回生成器,每次調用返回每行,已經不推薦這種用法,
推薦使用for line in f的方式
21. 列舉布爾值爲False的常見值?
0,空字符串,空字典,空列表,None【一個特殊的常量】
22. 字符串、列表、元組、字典每一個經常使用的5個方法?
字符串
name.capitalize()) # 把字符串的第一個字符大寫
name.isspace()) # 是否爲空格
name.replace('Li', '') # 替換操做
name.split('m') # 分割操做,打印: ["I'a", ' LiChengGuan']
name.strip() # 去掉字符串的左右空格或自定字符串
name.find('Li') # 查找,打印 5,即返回開始的索引值,不然返回-1
name.index('Li')
name.split() #按照指定元素分割
[::step] #切片,
列表
s= [1,2,3]
s.extend(s1) # 在列表末尾擴展另外一個列表
s.append('測試拼接') # 列表末尾添加新的元素
s.insert(0, '測試拼接') # 指定位置插入元素
s.pop(0) # 指定位置刪除,默認刪除最後一個
s.remove(3) # 移除列表中某個值的第一個匹配項,沒有會拋異常
s.clear() # 清空
s.reverse() #反轉
元組
元組不可變
字典
dic.keys() # 輸出全部鍵
dic.values() # 輸出全部值
dic.items()
dic.pop('code') # 刪除 code 鍵
dic.popitem() #隨機刪除
dic.clear() # 清空
del dic
23. lambda表達式格式以及應用場景?
lambda格式 lambda args:return expression
用於定義不須要命名,邏輯簡單的函數
24. pass的做用?
pass是空語句,是爲了保持程序結構的完整性,通常用作佔位語句
25. *arg和**kwarg做用
函數定義中使用*args,**kwargs傳遞變長參數
*args用於傳遞位置參數,**kwargs用於傳遞關鍵字參數
26. is和==的區別
is 比較的是兩個實例對象是否是徹底相同,它們是否是同一個對象,佔用的內存地址是否相同
== 比較的是兩個對象的內容/值是否相等,即內存地址能夠不同,內容同樣就能夠了
27.簡述Python的深淺拷貝以及應用場景?
淺拷貝只拷貝一層,深拷貝拷貝全部層,用於複製數據
28.Python垃圾回收機制?
引用計數機制
python中一切皆對象,他們的核心就是一個結構體pyobject,
其中ob_refcnt就是作爲引用計數,當一個對象有新的引用時,它的ob_refcent就會增長,當引用它的對象被刪除,它的ob_refcnt
就會減小,當引用計數爲0時,改對象生命就結束了
29. Python的可變類型和不可變類型?
不可變類型 : 基礎類型字符串,數字,布爾值,字節.另外還有一個元組
可變類型 : 數據結構列表,字典,集合
30. 求結果:
v = dict.fromkeys(['k1','k2'],[])
v[‘k1’].append(666)
print(v)
v[‘k1’] = 777
print(v)
fromkey生成的字典,指向同一個內存地址
{'k1':777,'k2':[666]}
31. 求結果:
理解:函數查找變量的時刻,函數調用時纔會查找變量
num() --> [lambda x:i*x,lambda x:i*x,lambda x:i*x,lambda x:i*x]
m(2)調用時查找i,for循環結束後i是3
結果[6,6,6,6]
32. 列舉常見的內置函數?
enumertae:枚舉,返回索引與值的元組
zip:拉鍊函數,接收多個可迭代對象,將對象相同索引位置放在一個元組中,返回一個迭代器,返回迭代器中元素個數由最短的可迭代對象決定
filter:過濾函數,接收一個函數和一個可迭代對象,生成一個迭代器.將可迭代對象的每個元素帶入函數中,若是返回結果爲True,則把元素添加入迭代器中
map:處理函數,接收一個函數和一個可迭代對象,生成一個迭代器,將可迭代對象的每個元素帶入函數中,把返回值添加入迭代器中
callble:判斷參數是否是可調用的
dir:查看內置屬性和方法的字符串
super:根據__mro__屬性去查找方法
isinstance:判斷一個對象是否是這個類實例化出來的
iscubclass:判斷一個類是否是另外一個類的子類,也能夠判斷兩個類是否是相同的類
33. filter、map、reduce的做用?
filter:過濾函數,接收一個函數和一個可迭代對象,生成一個迭代器.將可迭代對象的每個元素帶入函數中,若是返回結果爲True,則把元素添加入迭代器中
map:處理函數,接收一個函數和一個可迭代對象,生成一個迭代器,將可迭代對象的每個元素帶入函數中,把返回值添加入迭代器中
reduce函數將一個數據集合(鏈表,元組等)中的全部數據進行下列操做:
用傳給reduce中的函數(有兩個參數)先對集合中的元素進行操做,獲得的結果再與第三個參數用函數運算,最後獲得一個結果。
34. 一行代碼實現9*9乘法表
print ("\n".join("\t".join(["%s*%s=%s" %(x,y,x*y) for y in range(1, x+1)]) for x in range(1, 10)))
35.如何安裝第三方模塊?以及用過哪些第三方模塊?
pip install
PIL 圖像處理標準庫
requests處理URL
Tkinter圖形界面
36,至少列舉8個經常使用模塊都有那些?
random模塊
os模塊
sys模塊
time模塊
re模塊
序列化模塊
hashlib模塊
logging模塊
collections模塊
37.re的match和search區別?
re.match從開頭開始匹配string
re.search從任意位置匹配
38.什麼是正則的貪婪匹配?
貪婪匹配:正則表達式通常趨向於最大長度匹配,也就是所謂的貪婪匹配。
非貪婪匹配:就是匹配到結果就好,就少的匹配字符。
39.求結果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )
a [0,1,0,1,0,1,0,1,0,1] 列表
b (0,1,0,1,0,1,0,1,0,1) 生成器
40. 求結果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
a. 1 b,2,c False,d,True
41. def func(a,b=[]) 這種寫法有什麼坑?
函數調用時b使用默認參數時,指向同一個內存地址
42.如何實現 「1,2,3」 變成 [‘1’,’2’,’3’] ?
a = "1,2,3"
b = a.split(',')
43. 如何實現[‘1’,’2’,’3’]變成[1,2,3] ?
[int(i) for i in ['1','2','3']]
44. 比較: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的區別?
a,b列表元素都是數字,c元素是元組
45. 如何用一行代碼生成[1,4,9,16,25,36,49,64,81,100] ?
[i**2 for i in range(1,11)]
46. 一行代碼實現刪除列表中重複的值 ?
list1 = [...]
list2 = list(set(list1))
47. 如何在函數中設置一個全局變量 ?
global變量
48. logging模塊的做用?以及應用場景?
loggin用來記錄日誌,能夠定製日誌的格式,級別和輸出形式
程序調試
瞭解軟件程序運行狀況,是否正常
軟件程序運行故障分析與問題定位
49.請用代碼簡答實現stack【堆棧】。
Stack():建立一個新的空棧
push(item):添加一個新的元素
item到棧頂
pop():彈出棧頂元素
peek():返回棧頂元素,且不從棧中刪除
is_empty():判斷棧是否爲空
size():返回棧的元素個數
class Stack:
def __init__(self):
self.items=[]
def is_empty(self):
return self.items==[]
def push(self,item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[-1]
def size(self):
return len(self.items)
50.經常使用字符串格式化哪幾種?
f"{}abc{}",%,format()
51. 簡述 生成器、迭代器、可迭代對象 以及應用場景?
生成器 : 本身實現的迭代器
迭代器 : 調用next()方法,從中取值,或拋出一個異常.也有__iter__方法
可迭代對象 : 擁有__iter__方法,返回一個迭代器
應用場景 : 處理大量數據時逐個取值,減小內存佔用
52. 用Python實現一個二分查找的函數。
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def search(value,list1,start=0,end=None):
end = len(list1) if end is None else end
zj = (end - start) // 2+start
if start<=end:
if value>list1[zj]:
return search(3,list1,start=zj+1,end=end)
elif value<list1[zj]:
return search(3,list1,start=start,end=zj-1)
else:
return zj
return '找不到這個值'
53. 談談你對閉包的理解?
內部函數包含了對外部函數變量的引用,內部函數被執行
54. os和sys模塊的做用?
os封裝了系統相關功能,sys模塊封裝瞭解釋器相關功能
55. 如何生成一個隨機數?
random模塊
56. 如何使用python刪除一個文件?
os.remove('path')
57. 談談你對面向對象的理解?
面向對象是基於萬物皆對象這個哲學觀點. 所謂的面向對象就是將咱們的程序模塊化, 對象化,
把具體事物的特性屬性和經過這些屬性來實現一些動做的具體方法放到一個類裏面
面向對象的三大特徵 繼承,封裝,多態
58. Python面向對象中的繼承有什麼特色?
1.在繼承中基類的構造(__init__()方法)不會被自動調用,它須要在其派生類的構造中親自專門調用。
2.在調用基類的方法時,須要加上基類的類名前綴,且須要帶上self參數變量。
區別於在類中調用普通函數時並不須要帶上self參數
3.Python老是首先查找對應類型的方法,若是它不能在派生類中找到對應的方法,它纔開始到基類中逐個查找,
即先在本類中查找調用的方法,找不到纔去基類中找。
59. 面向對象深度優先和廣度優先是什麼?
在經典類中,是深度優先,先把一條線查完
在新式類中,廣度優先(順着一條線查,若是還有別的路能夠查到一個類,這條路就終止了,換一條線查)
python3中都是新式類,在python中若是你建立了一個類,而且該類沒有繼承任意類,那麼他就是一個經典類
60. 面向對象中super的做用?
調用父類的方法
61. 是否使用過functools中的函數?其做用是什麼?
裝飾器修復的函數functool.wraps
functools.reduce(function, iterable[, initializer]),對可迭代對象進行函數處理
partial對象
62. 列舉面向對象中帶爽下劃線的特殊方法,
__init__(self,...) 、__del__(self) 、__call__(self, *args) 、
__str__(self方法)、__add__、__dic__、__getitem__、__setitem__、__delitem__、__iter__
63.如何判斷是函數仍是方法?
isinstance(obj, FunctionType)
isinstance(obj, MethodType)
64. 靜態方法和類方法區別?
靜態方法 : 至關於在類做用域下的普通函數,不進行與類或實例相關的操做,不使用類或實例的資源
類方法 : 由類調用,進行與類有關的操做
65. 列舉面向對象中的特殊成員以及應用場景
1. __doc__表示類的描述信息
2. __module__ 和 __class__
__module__ 表示當前操做的對象在哪一個模塊
__class__ 表示當前操做的對象的類是什麼
3. __init__
構造方法,經過類建立對象時,自動觸發執行。
4. __del__
析構方法,當對象在內存中被釋放時,自動觸發執行。
5. __call__
對象後面加括號,觸發執行。
6. __dict__
類或對象中的全部成員
7. __str__
若是一個類中定義了__str__方法,那麼在打印 對象 時,默認輸出該方法的返回值。
八、__getitem__、__setitem__、__delitem__
用於索引操做,如字典。以上分別表示獲取、設置、刪除數據
九、__getslice__、__setslice__、__delslice__
該三個方法用於分片操做,如:列表 slice : 切片 切割
10. __iter__
用於迭代器,之因此列表、字典、元組能夠進行for循環,是由於類型內部定義了 __iter__
11. __new__ 和 __metaclass__
66. 一、二、三、四、5 能組成多少個互不相同且無重複的三位數
list1 = [i*100+j*10+k for i in range(1,10) for j in range(1,10) for k in range(1,10)]
print(len(list1))
67.什麼是反射?以及應用場景?
利用字符串獲取對象的屬性或方法,WEB框架的CBV,DRF接口框架中使用了大量反射
68. metaclass做用?以及應用場景?
metaclass是類的產生類,而並不是繼承類
經過它來控制類的產生,以及類實例化的操做
form組件中經過meta類控制字段
69.用盡可能多的方法實現單例模式。
使用模塊
使用裝飾器
使用類
使用__new__方法
基於metaclass方式
70. 裝飾器的寫法以及應用場景。
def wrapper(f):
def inner(*args,**kwargs):
#函數執行前操做
ret = f(*args,**kwargs)
#函數執行後操做
return ret
return inner
@wrapper
def func(*args,**kwargs):
pass
應用場景:
1.能夠在外層函數加上時間計算函數,計算函數運行時間;
2.計算函數運行次數;
3.能夠用在框架的路由傳參上;
4.插入日誌,做爲函數的運行日誌;
5.事務處理,可讓函數實現事務的一致性,讓函數要麼一塊兒運行成功,要麼一塊兒運行失敗;
6.緩存,實現緩存處理;
7.權限的校驗,在函數外層套上權限校驗的代碼,實現權限校驗;
71.異常處理寫法以及如何主動拋出異常(應用場景)
raise 異常名稱(‘異常描述’) 語句主動拋出異常
應用場景時mysql操做數據庫時,保證事務一致性
72. 什麼是面向對象的mro
mro即method resolution order,主要用於在多繼承時判斷調的屬性的路徑(來自於哪一個類)
mro基於c3算法
73. isinstance做用以及應用場景?
判斷對象是否是一個類的子類或者後代類的對象,判斷對象是方法仍是函數
74. 寫代碼並實現:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would
have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1]
def func(iter,target):
for i in iter:
if target-i in iter:
findex = iter.index(i)
sindex = iter.index(target-i)
return [findex,sindex]
else:
pass
else:
return '沒有符合條件的'
75. json序列化時,能夠處理的數據類型有哪些?如何定製支持datetime類型?
字符串、列表、字典、數字、布爾值、None
自定義類
class MyTime(json.JSONEncoder):
def default(self, o): # o是數據類型
if isinstance(o,datetime.datetime):
return o.strftime('%Y-%m-%d')
else:
return super(MyTime,self).default(o)
76.json序列化時,默認遇到中文會轉換成unicode,若是想要保留中文怎麼辦?
dumps時指定ensure_ascii=False
77. 什麼是斷言?應用場景?
斷言條件爲真時代碼繼續執行,不然拋出異常,這個異常一般不會去捕獲他.
咱們設置一個斷言目的就是要求必須實現某個條件
78. 有用過with statement嗎?它的好處是什麼?
with語句的做用是經過某種方式簡化異常處理,它是所謂的上下文管理器的一種
一、解決異常退出時資源釋放的問題;
二、解決用戶忘記調用close方法而產生的資源泄漏問題;
79.使用代碼實現查看列舉目錄下的全部文件。
def print_directory_contents(sPath):
import os
for sChild in os.listdir(sPath):
sChildPath = os.path.join(sPath, sChild)
if os.path.isdir(sChildPath):
print_directory_contents(sChildPath)
else:
print(sChildPath)
80.簡述 yield和yield from關鍵字。
yield : 生成器函數關鍵字
yield from : 至關於for i in obj : yield i
網絡編程
1.簡述 OSI 七層協議。
爲了實現計算機系統的互連,OSI參考模型把整個網絡的通訊功能劃分爲7個層次,
同時也定義了層次之間的相互關係以及各層所包括的服務及每層的功能。
OSI的七層由低到高依次爲:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層,
下三層(物理層、數據鏈路層、網絡層)面向數據通訊,
而上三層(會話層、表示層、應用層)則面向資源子網,
而傳輸層則是七層中最爲重要的一層。它位於上層和下層中間,起承上啓下的做用。
應用層
與其它計算機進行通信的一個應用,它是對應應用程序的通訊服務的。
例如,一個沒有通訊功能的字處理程序就不能執行通訊的代碼,從事字處理工做的程序員也不關心OSI的第7層。
可是,若是添加了一個傳輸文件的選項,那麼字處理器的程序員就須要實現OSI的第7層。
示例:TELNET,HTTP,FTP,NFS,SMTP等。
表示層
這一層的主要功能是定義數據格式及加密。
例如,FTP容許你選擇以二進制或ASCII格式傳輸。若是選擇二進制,那麼發送方和接收方不改變 文件的內容。
若是選擇ASCII格式,發送方將把文本從發送方的字符集轉換成標準的ASCII後發送數據。
在接收方將標準的ASCII轉換成接收方計算機的字符集。示例:加密,ASCII等。
會話層
它定義瞭如何開始、控制和結束一個會話,包括對多個雙向消息的控制和管理,
以便在只完成連續消息的一部分時能夠通知應用,
從而使表示層看到的數據是連續的,在某些狀況下,若是表示層收到了全部的數據,
則用數據表明表示層。示例:RPC,SQL等。
傳輸層
這層的功能包括是否選擇差錯恢復協議仍是無差錯恢復協議,
及在同一主機上對不一樣應用的數據流的輸入進行復用,還包括對收到的順序不對的數據包的從新排序功能。
示例:TCP,UDP,SPX。
網絡層
這層對端到端的包傳輸進行定義,它定義了可以標識全部結點的邏輯地址,
還定義了路由實現的方式和學習的方式。爲了適應最大傳輸單元長度小於包長度的傳輸介質,
網絡層還定義瞭如何將一個包分解成更小的包的分段方法。示例:IP,IPX等。
數據鏈路層
它定義了在單個鏈路上如何傳輸數據。這些協議與被討論的各類介質有關。示例:ATM,FDDI等。
物理層
OSI的物理層規範是有關傳輸介質的特這些規範一般也參考了其餘組織制定的標準。
鏈接頭、幀、幀的使用、電流、編碼及光調製等都屬於各類物理層規範中的內容。
物理層經常使用多個規範完成對全部細節的定義。示例:Rj45,802.3等。
2.什麼是C/S和B/S架構?
C/S 架構的概念
C/S是Client/Server,即客戶端/服務器端架構,一種典型的兩層架構。
客戶端包含一個或多個在用戶的電腦上運行的程序
服務器端有兩種,一種是數據庫服務器端,客戶端經過數據庫鏈接訪問服務器端的數據;
另外一種是Socket服務器端,服務器端的程序經過Socket與客戶端的程序通訊。
C/S 能夠看作是胖客戶端架構
由於客戶端須要實現絕大多數的業務邏輯和界面展現。做爲客戶端的部分須要承受很大的壓力,
由於顯示邏輯和事務處理都包含在其中,
經過與數據庫的交互(一般是SQL或存儲過程的實現)來達到持久化數據,以此知足實際項目的須要。
C/S 優勢和缺點
優勢: (1)界面和操做能夠很豐富
(2) 安全性能能夠很容易保證,實現多層認證也不難
(3)因爲只有一層交互,所以響應速度較快。
缺點: (1)適用面窄,一般用於局域網中
(2)用戶羣固定。因爲程序須要安裝纔可以使用,所以不適合面向一些不可知的用戶
(3)維護成本高。發生一次升級,則全部客戶端的程序都須要改變。
B/S 架構的概念
B/S是Browser/Server,即瀏覽器/服務器架構。
Browser指的是Web瀏覽器,極少數事務邏輯在前端實現,但主要事務邏輯在服務器端實現,Browser客戶端,WebApp服務器端和DB端構成所謂的三層架構。
B/S架構的系統無須特別安裝,只有Web瀏覽器便可。
B/S 能夠看作是瘦客戶端架構
B/S架構中,顯示邏輯交給了Web瀏覽器,事務處理邏輯在放在了WebApp上,這樣就避免了龐大的胖客戶端,減小了客戶端的壓力。由於客戶端包含的邏輯不多,所以也被成爲瘦客戶端。
C/S 優勢和缺點
優勢:(1)客戶端無需安裝,有Web瀏覽器便可 (2)BS架構能夠直接放在廣域網上,經過必定的權限控制實現多客戶訪問的目的,交互性較強。(3)BS架構無需升級多個客戶端,升級服務器便可。
缺點:(1)在跨瀏覽器上,BS架構不盡如人意。(2)表現要達到CS程序的程度須要花費很多精力。(3)在速度和安全性上須要花費巨大的設計成本,這是BS架構的最大問題。(4)C和S交互是請求-響應模式,一般須要刷新頁面,這並非客戶樂意看到的。(在Ajax風行後此問題獲得了必定程度的緩解)
3.簡述 三次握手、四次揮手的流程。
三次握手
在TCP/IP協議中,TCP協議提供可靠的鏈接服務,採用三次握手創建一個鏈接
(1)第一次握手:Client將標誌位SYN置爲1,隨機產生一個值seq=J,並將該數據包發送給Server,
Client進入SYN_SENT狀態,等待Server確認。 (
2)第二次握手:Server收到數據包後由標誌位SYN=1知道Client請求創建鏈接,
Server將標誌位SYN和ACK都置爲1,ack=J+1,隨機產生一個值seq=K,
並將該數據包發送給Client以確認鏈接請求,Server進入SYN_RCVD狀態。 (
3)第三次握手:Client收到確認後,檢查ack是否爲J+1,ACK是否爲1,
若是正確則將標誌位ACK置爲1,ack=K+1,並將該數據包發送給Server,
Server檢查ack是否爲K+1,ACK是否爲1,若是正確則鏈接創建成功,Client和Server進入ESTABLISHED狀態,
完成三次握手,隨後Client與Server之間能夠開始傳輸數據了
四次握手
所謂四次揮手(Four-Way Wavehand)即終止TCP鏈接,就是指斷開一個TCP鏈接時,
須要客戶端和服務端總共發送4個包以確認鏈接的斷開
(1)第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
(2)第二次揮手:Server收到FIN後,發送一個ACK給Client,
確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。
(3)第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
(4)第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號爲收到序號+1,Server進入CLOSED狀態,完成四次揮手。
4.什麼是arp協議?
地址解析協議ARP(Address Resolution Protocol),負責完成邏輯地址向物理地址的動態映射,
將32位邏輯地址(IP地址)轉換爲48位的物理地址(MAC地址)
ARP是經過一個查找表(ARP緩存)來執行這種轉換的。
當在ARP緩存中沒有找到地址時,則向網絡發送一個廣播請求,
網絡上全部的主機和路由器都接收和處理這個ARP請求,
可是隻有相同IP地址的接收到廣播請求的主機或路由器,發回一個ARP應答分組,
應答中包含它的IP地址和物理地址,並保存在請求主機的ARP緩存中
1) 本地主機在局域網中廣播ARP請求,ARP請求數據幀中包含目的主機的IP地址。
意思是「若是你是這個IP地址的擁有者,請回答你的硬件地址」。
2) 目的主機的ARP層解析這份廣播報文,識別出是詢問其硬件地址。因而發送ARP應答包,
裏面包含IP地址及其對應的硬件地址。
3) 本地主機收到ARP應答後,知道了目的地址的硬件地址,以後的數據報就能夠傳送了。
5. TCP和UDP的區別?
一、TCP面向鏈接(如打電話要先撥號創建鏈接);UDP是無鏈接的,即發送數據以前不須要創建鏈接
二、TCP提供可靠的服務。也就是說,經過TCP鏈接傳送的數據,無差錯,不丟失,不重複,且按序到達;
UDP盡最大努力交付,即不保證可靠交付
三、TCP面向字節流,其實是TCP把數據當作一連串無結構的字節流;UDP是面向報文的
UDP沒有擁塞控制,所以網絡出現擁塞不會使源主機的發送速率下降
(對實時應用頗有用,如IP電話,實時視頻會議等)
四、每一條TCP鏈接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通訊
五、TCP首部開銷20字節;UDP的首部開銷小,只有8個字節
六、TCP的邏輯通訊信道是全雙工的可靠信道,UDP則是不可靠信道
6.什麼是局域網和廣域網?
局域網(Local Area Network),簡稱LAN,是指在某一區域內由多臺計算機互聯成的計算機組。
「某一區域」指的是同一辦公室、同一建築物、同一公司和同一學校等,通常是方圓幾公里之內。
局域網能夠實現文件管理、應用軟件共享、打印機共享、掃描儀共享、工做組內的日程安排、
電子郵件和傳真通訊服務等功能。局域網是封閉型的,能夠由辦公室內的兩臺計算機組成,
也能夠由一個公司內的上千臺計算機組成。
廣域網
廣域網(Wide Area Network),簡稱WAN,是一種跨越大的、地域性的計算機網絡的集合。
一般跨越省、市,甚至一個國家。廣域網包括大大小小不一樣的子網,子網能夠是局域網,
也能夠是小型的廣域網。
7. 爲什麼基於tcp協議的通訊比基於udp協議的通訊更可靠?
TCP的可靠保證,是它的三次握手雙向機制,這一機制保證校驗了數據,保證了他的可靠性。
而UDP就沒有了,udp信息發出後,不驗證是否到達對方,因此不可靠
8. 什麼是socket?簡述基於tcp協議的套接字通訊流程。
什麼是socket?
簡單來說,Socket是網絡應用程序接口,是應用層到傳送層的接口。
也就是用戶進程,與系統內核的接口,即API。
網絡上的兩個程序經過一個雙向的通訊鏈接實現數據的交換,這個鏈接的一端稱爲一個socket。
TCP Socket通訊的基本流程
①服務端建立一個ServerSocket對象,指定端口號,ServerSocket對象等待客戶端的鏈接請求。
②客戶端建立一個Socket對象,指定主機地址和端口號,向服務端發出鏈接請求。
③服務端接收到客戶端的鏈接請求,創建一條TCP鏈接,再建立一個Socket對象與客戶端的Socket對象進行通訊。
④服務端和客戶端分別建立字節輸入流和字節輸出流,經過字節輸入流得到對方發來的數據,經過字節輸出流向對方發送數據。
⑤當一方決定結束通訊時,向對方發送結束信息;另外一方接收到結束信息後,雙方分別關閉各自的TCP鏈接。
⑥ServerSocket對象中止等待客戶端的鏈接請求。
9.什麼是粘包? socket 中形成粘包的緣由是什麼? 哪些狀況會發生粘包現象?
TCP粘包是指發送方發送的若干包數據到接收方接收時粘成一包,
從接收緩衝區看,後一包數據的頭緊接着前一包數據的尾
所以TCP協議是面向流的協議,這也是容易出現粘包問題的緣由
所謂粘包問題主要仍是由於接收方不知道消息之間的界限,不知道一次性提取多少字節的數據所形成的。
粘包狀況
(1)發送方緣由
咱們知道,TCP默認會使用Nagle算法。而Nagle算法主要作兩件事:
1)只有上一個分組獲得確認,纔會發送下一個分組;
2)收集多個小分組,在一個確認到來時一塊兒發送。
因此,正是Nagle算法形成了發送方有可能形成粘包現象。
(2)接收方緣由
TCP接收到分組時,並不會馬上送至應用層處理,
或者說,應用層並不必定會當即處理;
實際上,TCP將收到的分組保存至接收緩存裏,而後應用程序主動從緩存裏讀收到的分組。
這樣一來,若是TCP接收分組的速度大於應用程序讀分組的速度,多個包就會被存至緩存,
應用程序讀時,就會讀到多個首尾相接粘到一塊兒的包。
10. IO多路複用的做用?
I/O多路複用是用於提高效率,單個進程能夠同時監聽多個網絡鏈接IO
I/O是指Input/Output
I/O多路複用,經過一種機制,能夠監視多個文件描述符,
一旦描述符就緒(讀就緒和寫就緒),能通知程序進行相應的讀寫操做。
I/O多路複用避免阻塞在io上,
本來爲多進程或多線程來接收多個鏈接的消息變爲單進程或單線程保存多個socket的狀態後輪詢處理.
11. 什麼是防火牆以及做用?
防火牆指的是一個由軟件和硬件設備組合而成、在內部網和外部網之間、
專用網與公共網之間的界面上構造的保護屏障,是一種獲取安全性方法的形象說法,
它是一種計算機硬件和軟件的結合,使Internet與Intranet之間創建起一個安全網關(Security Gateway),
從而保護內部網免受非法用戶的侵入。
防火牆的功能
加強的保密性
使用Firewall能夠阻止攻擊者獲取攻擊網絡系統的有用信息,如Figer和DNS。
記錄和統計網絡利用數據以及非法使用數據,Firewall能夠記錄和統計經過Firewall的網絡通信,
提供關於網絡使用的統計數據,而且,Firewall能夠提供統計數據, 來判斷可能的攻擊和探測。
保護脆弱的服務
經過過濾不安全的服務,Firewall能夠極大地提升網絡安全和減小子網中主機的風險。
例如, Firewall能夠禁止NIS、NFS服務經過,Firewall同時能夠拒絕源路由和ICMP重定向封包。
控制對系統的訪問
Firewall能夠提供對系統的訪問控制。如容許從外部訪問某些主機,
同時禁止訪問另外的主機。例如, Firewall容許外部訪問特定的Mail Server和Web Server。
集中的安全管理
Firewall對企業內部網實現集中的安全管理,在Firewall定義的安全規則能夠運行於整個內部網絡系統,
而無須在內部網每臺機器上分別設立安全策略。Firewall能夠定義不一樣的認證方法,
而不須要在每臺機器上分別安裝特定的認證軟件。外部用戶也只須要通過一次認證便可訪問內部網。
12. select、poll、epoll 模型的區別?
elect,poll,epoll本質上都是同步I/O,由於他們都須要在讀寫事件就緒後本身負責進行讀寫,
也就是說這個讀寫過程是阻塞的
select
每次調用select,都須要把fd集合從用戶態拷貝到內核態,這個開銷在fd不少時會很大
同時每次調用select都須要在內核遍歷傳遞進來的全部fd,這個開銷在fd不少時也很大
select支持的文件描述符數量過小了,默認是1024
1)select,poll實現須要本身不斷輪詢全部fd集合,直到設備就緒,期間可能要睡眠和喚醒屢次交替。
而epoll其實也須要調用epoll_wait不斷輪詢就緒鏈表,期間也可能屢次睡眠和喚醒交替,
可是它是設備就緒時,調用回調函數,把就緒fd放入就緒鏈表中,
並喚醒在epoll_wait中進入睡眠的進程。雖然都要睡眠和交替,
可是select和poll在「醒着」的時候要遍歷整個fd集合,
而epoll在「醒着」的時候只要判斷一下就緒鏈表是否爲空就好了,這節省了大量的CPU時間。
這就是回調機制帶來的性能提高。
(2)select,poll每次調用都要把fd集合從用戶態往內核態拷貝一次,
而且要把current往設備等待隊列中掛一次,而epoll只要一次拷貝,
並且把current往等待隊列上掛也只掛一次(在epoll_wait的開始,注意這裏的等待隊列並非設備等待隊列,
只是一個epoll內部定義的等待隊列)。這也能節省很多的開銷。
13. 簡述 進程、線程、協程的區別 以及應用場景?
一、進程
進程是具備必定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
每一個進程都有本身的獨立內存空間,不一樣進程經過進程間通訊來通訊。
因爲進程比較重量,佔據獨立的內存,因此上下文進程間的切換開銷(棧、寄存器、虛擬內存、文件句柄等)比較大,
但相對比較穩定安全。
二、線程
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.
線程本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),
可是它可與同屬一個進程的其餘的線程共享進程所擁有的所有資源。線程間通訊主要經過共享內存,
上下文切換很快,資源開銷較少,但相比進程不夠穩定容易丟失數據。
三、協程
協程是一種用戶態的輕量級線程,協程的調度徹底由用戶控制。協程擁有本身的寄存器上下文和棧。
協程調度切換時,將寄存器上下文和棧保存到其餘地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,
直接操做棧則基本沒有內核切換的開銷,能夠不加鎖的訪問全局變量,因此上下文的切換很是快
區別:
一、進程多與線程比較
線程是指進程內的一個執行單元,也是進程內的可調度實體。線程與進程的區別:
1) 地址空間:線程是進程內的一個執行單元,進程內至少有一個線程,它們共享進程的地址空間,
而進程有本身獨立的地址空間
2) 資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
3) 線程是處理器調度的基本單位,但進程不是
4) 兩者都可併發執行
5) 每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口,可是線程不可以獨立執行,
必須依存在應用程序中,由應用程序提供多個線程執行控制
二、協程多與線程進行比較
1) 一個線程能夠多個協程,一個進程也能夠單獨擁有多個協程,這樣python中則能使用多核CPU。
2) 線程進程都是同步機制,而協程則是異步
3) 協程能保留上一次調用時的狀態,每次過程重入時,就至關於進入上一次調用的狀態
應用場景:
一、多進程通常使用multiprocessing庫,來利用多核CPU,主要是用在CPU密集型的程序上,
固然生產者消費者這種也可使用。多進程的優點就是一個子進程崩潰並不會影響其餘子進程和主進程的運行,
但缺點就是不能一次性啓動太多進程,會嚴重影響系統的資源調度,特別是CPU使用率和負載。
二、多線程通常是使用threading庫,完成一些IO密集型併發操做。
多線程的優點是切換快,資源消耗低,但一個線程掛掉則會影響到全部線程,因此不夠穩定。
三、協程通常是使用gevent庫,固然這個庫用起來比較麻煩,因此使用的並非不少。
相反,協程在tornado的運用就多得多了,使用協程讓tornado作到單線程異步,聽說還能解決C10K的問題。
因此協程使用的地方最多的是在web應用上。
總結一下就是IO密集型通常使用多線程或者多進程,CPU密集型通常使用多進程,
強調非阻塞異步併發的通常都是使用協程,固然有時候也是須要多進程線程池結合的,或者是其餘組合方式。
14. GIL鎖是什麼鬼?
Python的線程雖然是真正的線程,但解釋器執行代碼時,有一個GIL鎖:Global Interpreter Lock,
任何Python線程執行前,必須先得到GIL鎖,而後,每執行100條字節碼,解釋器就自動釋放GIL鎖,
讓別的線程有機會執行。這個GIL全局鎖實際上把全部線程的執行代碼都給上了鎖,
因此,多線程在Python中只能交替執行,即便100個線程跑在100核CPU上,也只能用到1個核。
GIL是Python解釋器設計的歷史遺留問題,一般咱們用的解釋器是官方實現的CPython,
要真正利用多核,除非重寫一個不帶GIL的解釋器。
因此,在Python中,可使用多線程,但不要期望能有效利用多核。若是必定要經過多線程利用多核,
那隻能經過C擴展來實現,不過這樣就失去了Python簡單易用的特色。
不過,也不用過於擔憂,Python雖然不能利用多線程實現多核任務,但能夠經過多進程實現多核任務。
多個Python進程有各自獨立的GIL鎖,互不影響。
15. Python中如何使用線程池和進程池?
Python標準庫爲咱們提供了threading和multiprocessing模塊編寫相應的多線程/多進程代碼,
可是當項目達到必定的規模,頻繁建立/銷燬進程或者線程是很是消耗資源的,
這個時候咱們就要編寫本身的線程池/進程池,以空間換時間。
但從Python3.2開始,標準庫爲咱們提供了concurrent.futures模塊,
它提供了ThreadPoolExecutor和ProcessPoolExecutor兩個類,實現了對threading和multiprocessing的進一步抽象,
對編寫線程池/進程池提供了直接的支持。
16. threading.local的做用?
爲每一個線程建立一個獨立的空間,使得線程對本身的空間中的數據進行操做(數據隔離)。
17. 進程之間如何進行通訊?
一、無名管道通訊
無名管道( pipe ):管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用。
進程的親緣關係一般是指父子進程關係。
二、高級管道通訊
高級管道(popen):將另外一個程序當作一個新的進程在當前程序進程中啓動,則它算是當前程序的子進程,
這種方式咱們成爲高級管道方式。
三、有名管道通訊
有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。
四、消息隊列通訊
消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。
消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。
五、信號量通訊
信號量( semophore ) : 信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問。
它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源。
所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段。
六、信號
信號 ( sinal ) : 信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生。
七、共享內存通訊
共享內存( shared memory ) :共享內存就是映射一段能被其餘進程所訪問的內存,
這段共享內存由一個進程建立,但多個進程均可以訪問。共享內存是最快的 IPC 方式,
它是針對其餘進程間通訊方式運行效率低而專門設計的。它每每與其餘通訊機制,如信號兩,配合使用,
來實現進程間的同步和通訊。
八、套接字通訊
套接字( socket ) : 套接口也是一種進程間通訊機制,與其餘通訊機制不一樣的是,
它可用於不一樣機器間的進程通訊。
18. 什麼是併發和並行?
併發:指應用可以交替執行不一樣的任務,例:吃完飯->喝水 喝完水->睡覺 一覺醒來->吃飯......
並行:指應用可以同時執行不一樣的任務,例:吃飯的時候能夠邊吃飯邊打電話,這兩件事情能夠同時執行
二者區別:一個是交替執行,一個是同時執行.
19. 進程鎖和線程鎖的做用?
線程鎖:
你們都不陌生,主要用來給方法、代碼塊加鎖。當某個方法或者代碼塊使用鎖時,
那麼在同一時刻至多僅有有一個線程在執行該段代碼。當有多個線程訪問同一對象的加鎖方法/代碼塊時,
同一時間只有一個線程在執行,其他線程必需要等待當前線程執行完以後才能執行該代碼段。
可是,其他線程是能夠訪問該對象中的非加鎖代碼塊的。
進程鎖:
也是爲了控制同一操做系統中多個進程訪問一個共享資源,只是由於程序的獨立性,
各個進程是沒法控制其餘進程對資源的訪問的,可是可使用本地系統的信號量控制(操做系統基本知識)。
分佈式鎖:
當多個進程不在同一個系統之中時,使用分佈式鎖控制多個進程對資源的訪問。
20. 解釋什麼是異步非阻塞?
同步和異步
同步就是燒開水,須要本身去輪詢(每隔一段時間去看看水開了沒),異步就是水開了,
而後水壺會通知你水已經開了,你能夠回來處理這些開水了。
同步和異步是相對於操做結果來講,會不會等待結果返回。
阻塞和非阻塞
阻塞就是說在煮水的過程當中,你不能夠去幹其餘的事情,非阻塞就是在一樣的狀況下,
能夠同時去幹其餘的事情。阻塞和非阻塞是相對於線程是否被阻塞。
這二者存在本質的區別,它們的修飾對象是不一樣的。
阻塞和非阻塞是指進程訪問的數據若是還沒有就緒,
進程是否須要等待,簡單說這至關於函數內部的實現區別,也就是未就緒時是直接返回仍是等待就緒。
而同步和異步是指訪問數據的機制,同步通常指主動請求並等待I/O操做完畢的方式,
當數據就緒後在讀寫的時候必須阻塞,異步則指主動請求數據後即可以繼續處理其它任務,
隨後等待I/O,操做完畢的通知,這可使進程在數據讀寫時也不阻塞。
21. 路由器和交換機的區別?
1.
路由器能夠給你的局域網自動分配IP,虛擬撥號,就像一個交通警察,指揮着你的電腦該往哪走,你本身不用操心那麼多了。
交換機只是用來分配網絡數據的。
2.
路由器在網絡層,路由器根據IP地址尋址,路由器能夠處理TCP/IP協議,交換機不能夠。
交換機在中繼層,交換機根據MAC地址尋址。
3. 路由器能夠把一個IP分配給不少個主機使用,這些主機對外只表現出一個IP。
交換機能夠把不少主機連起來,這些主機對外各有各的IP。
4.
路由器提供防火牆的服務,交換機不能提供該功能。集線器、交換機都是作端口擴展的,
就是擴大局域網(一般都是以太網)的接入點,也就是能讓局域網能夠連進來更多的電腦。
路由器是用來作網間鏈接,也就是用來鏈接不一樣的網絡。
5.
全部郵局構成的系統,就是「廣域網」,而你的宿舍樓,就是「局域網」,構建局域網是不須要路由器的。
22. 什麼是域名解析?
域名解析是把域名指向網站空間IP,讓人們經過註冊的域名能夠方便地訪問到網站的一種服務.
域名解析就是域名到IP地址的轉換過程。域名的解析工做由DNS服務器完成。
23. 如何修改本地hosts文件?
hosts文件裏面存放的是ip地址、主機名和主機縮略名的內容,通常能夠用於測試本機上的網站
hosts文件位於C:\Windows\System32\drivers\etc文件夾中
記得使用管理員權限不然沒法修改。
osts記錄規則很是簡單,只須要將你的記錄以 「IP + 空格 + 域名」 的格式填寫便可。
如:192.168.0.1 cpaneleasy.com
保存後經過cmd命令行進行ping測試,就會發現域名的解析地址已經變動爲你所但願的了。
24. 生產者消費者模型應用場景及優點?
這樣一種狀況:某個模塊負責產生數據,這些數據由另外一個模塊來負責處理(此處的模塊是廣義的,
能夠是類、函數、線程、進程等)。產 生數據的模塊,就形象地稱爲生產者;而處理數據的模塊,就稱爲消費者。
在生產者與消費者之間在加個緩衝區,咱們形象的稱之爲倉庫,生產者負責往倉庫了進商品,
而消費者負責從倉庫裏拿商品,這就構成了生產者消費者模型。
模式的應用場景:處理數據比較消耗時間,線程獨佔,生產數據不須要即時的反饋等。
25. 什麼是cdn?
CDN的全稱是Content Delivery Network,即內容分發網絡。
其基本思路是儘量避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,
使內容傳輸的更快、更穩定。經過在網絡各處放置節點服務器所構成的在現有的互聯網基礎之上
的一層智能虛擬網絡,CDN系統可以實時地根據網絡流量和各節點的鏈接、
負載情況以及到用戶的距離和響應時間等綜合信息將用戶的請求從新導向離用戶最近的服務節點上。
其目的是使用戶可就近取得所需內容,解決 Internet網絡擁擠的情況,提升用戶訪問網站的響應速度。
26. LVS是什麼及做用?
LVS即Linux虛擬服務器,是一個虛擬的四層交換器集羣系統,
根據目標地址和目標端口實現用戶請求轉發,自己不產生流量,只作用戶請求轉發。
2七、Nginx是什麼及做用?
Nginx是一個輕量級、高性能、穩定性高、併發性好的HTTP和反向代理服務器。
2八、keepalived是什麼及做用?
Keepalived是Linux下一個輕量級別的高可用解決方案。
高可用,其實兩種不一樣的含義:廣義來說,是指整個系統的高可用行,狹義的來說就是之主機的冗餘和接管,
2九、haproxy是什麼以及做用?
HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代 理,支持虛擬主機,它是免費、快速而且可靠的一種解決方案。
HAProxy特別適用於那些負載特大的web站點,這些站點一般又須要會話保持或七層處理。HAProxy運行在當前的硬件上,
徹底能夠支持數以萬計的併發鏈接。而且它的運行模式使得它能夠很簡單安全的整合進您當前的架中,
同時能夠保護你的web服務器不被暴露到網絡上。
30、什麼是負載均衡?
負載均衡有兩方面的含義:
首先,大量的併發訪問或數據流量分擔到多臺節點設備上分別處理,減小用戶等待響應的時間;
其次,單個重負載的運算分擔到多臺節點設備上作並行處理,每一個節點設備處理結束後,
將結果彙總,返回給用戶,系統處理能力獲得大幅度提升。
3一、什麼是rpc及應用場景?
RPC 的全稱是 Remote Procedure Call 是一種進程間通訊方式。
它容許程序調用另外一個地址空間(一般是共享網絡的另外一臺機器上)的過程或函數,而不用程序員顯式編碼這個遠程調用的細節。
即程序員不管是調用本地的仍是遠程的,本質上編寫的調用代碼基本相同(例如QQ遠程操做)
3二、簡述 asynio模塊的做用和應用場景。
asyncio是Python 3.4版本引入的標準庫,直接內置了對異步IO的支持。
asyncio的異步操做,須要在coroutine中經過yield from完成。
3三、簡述 gevent模塊的做用和應用場景。
Gevent 是一個第三方庫,能夠輕鬆經過gevent實現併發同步或異步編程,
在gevent中用到的主要模式是Greenlet, 它是以C擴展模塊形式接入Python的輕量級協程。
Greenlet所有運行在主程序操做系統進程的內部,但它們被協做式地調度。
3四、twisted框架的使用和應用?
Twisted是一個事件驅動型的網絡模型。
時間驅動模型編程是一種範式,這裏程序的執行流由外部決定。
特色是:包含一個事件循環,當外部事件發生時,使用回調機制來觸發相應的處理。