面試彙總

1.爲何學習Python?css

2.經過什麼途徑學習的Python?html

3.Python和Java、PHP、C、C#、C++等其餘語言的對比?前端

4.簡述解釋型和編譯型編程語?vue

解釋 -- 運行時必需用解釋器把程序一行一行執行, 運行比較慢, 由於是運行時才把程序解析並執行. 優勢是移植性, 不一樣的機器只要有解釋器就能夠運行相同的程序

編譯 -- 先把程序轉成 CPU 跟操做系統認識的機械碼, 執行程序就是直接執行機械碼, 因此速度比較快, 但由於是機械碼 (加上一些操做系統的 loader 所要的信息), 不一樣的 CPU 與操做系統並不能運行編譯後的程序

5.Python解釋器種類以及特色?python

複製代碼
#CPython:CPython是使用最廣且被的Python解釋器
當咱們從Python官方網站下載並安裝好Python 2.7後,咱們就直接得到了一個官方版本的解釋器:CPython。這個解釋器是用C語言開發的,因此叫CPython。在命令行下運行python就是啓動CPython解釋器。

#IPython
IPython是基於CPython之上的一個交互式解釋器,也就是說,IPython只是在交互方式上有所加強,可是執行Python代碼的功能和CPython是徹底同樣的。比如不少國產瀏覽器雖然外觀不一樣,但內核其實都是調用了IE。
CPython用>>>做爲提示符,而IPython用In [序號]:做爲提示符。

#PyPy
PyPy是另外一個Python解釋器,它的目標是執行速度。PyPy採用JIT技術,對Python代碼進行動態編譯(注意不是解釋),因此能夠顯著提升Python代碼的執行速度。
絕大部分Python代碼均可以在PyPy下運行,可是PyPy和CPython有一些是不一樣的,這就致使相同的Python代碼在兩種解釋器下執行可能會有不一樣的結果。若是你的代碼要放到PyPy下執行,就須要瞭解PyPy和CPython的不一樣點。

#Jython
Jython是運行在Java平臺上的Python解釋器,能夠直接把Python代碼編譯成Java字節碼執行。

#IronPython
IronPython和Jython相似,只不過IronPython是運行在微軟.Net平臺上的Python解釋器,能夠直接把Python代碼編譯成.Net的字節碼。
複製代碼

6.位和字節的關係?linux

8位等於1個字節

7.b、B、KB、MB、GB 的關係ios

8b=1B
1024B=1KB
1024KB=1MB
1024MB=1GB

8.請至少列舉5個 PEP8 規範(越多越好)git

  View Code

一 代碼編排
縮進。4個空格的縮進(編輯器均可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
每行最大長度79,換行可使用反斜槓,最好使用圓括號。換行點要在操做符的後邊敲回車。
類和top-level函數定義之間空兩行;類中的方法定義之間空一行;函數內邏輯無關段落之間空一行;其餘地方儘可能不要再空行。

二 文檔編排
模塊內容的順序:模塊說明和docstring—import—globals&constants—其餘定義。其中import部分,又按標準、三方和本身編寫順序依次排放,之間空一行。
不要在一句import中多個庫,好比import os, sys不推薦。
若是採用from XX import XX引用庫,能夠省略‘module.’,都是可能出現命名衝突,這時就要採用import XX。

三 空格的使用
整體原則,避免沒必要要的空格。
各類右括號前不要加空格。
逗號、冒號、分號前不要加空格。
函數的左括號前不要加空格。如Func(1)。
序列的左括號前不要加空格。如list[2]。
操做符左右各加一個空格,不要爲了對齊增長空格。
函數默認參數使用的賦值符左右省略空格。
不要將多句語句寫在同一行,儘管使用‘;’容許。
if/for/while語句中,即便執行語句只有一句,也必須另起一行。

四 註釋
整體原則,錯誤的註釋不如沒有註釋。因此當一段代碼發生變化時,第一件事就是要修改註釋!
註釋必須使用英文,最好是完整的句子,首字母大寫,句後要有結束符,結束符後跟兩個空格,開始下一句。若是是短語,能夠省略結束符。
塊註釋,在一段代碼前增長的註釋。在‘#’後加一空格。段落之間以只有‘#’的行間隔。好比:
# Description : Module config.
#
# Input : None
#
# Output : None
行註釋,在一句代碼後加註釋。好比:x = x + 1 # Increment x
可是這種方式儘可能少使用。
避免無謂的註釋。

五 文檔描述
爲全部的共有模塊、函數、類、方法寫docstrings;非共有的沒有必要,可是能夠寫註釋(在def的下一行)。
若是docstring要換行,參考以下例子,詳見PEP 257
"""Return a foobang

Optional plotz says to frobnicate the bizbaz first.

"""

六 命名規範
整體原則,新編代碼必須按下面命名風格進行,現有庫的編碼儘可能保持風格。
儘可能單獨使用小寫字母‘l’,大寫字母‘O’等容易混淆的字母。
模塊命名儘可能短小,使用所有小寫的方式,可使用下劃線。
包命名儘可能短小,使用所有小寫的方式,不可使用下劃線。
類的命名使用CapWords的方式,模塊內部使用的類採用_CapWords的方式。
異常命名使用CapWords+Error後綴的方式。
全局變量儘可能只在模塊內有效,相似C語言中的static。實現方法有兩種,一是__all__機制;二是前綴一個下劃線。
函數命名使用所有小寫的方式,可使用下劃線。
常量命名使用所有大寫的方式,可使用下劃線。
類的屬性(方法和變量)命名使用所有小寫的方式,可使用下劃線。
類的屬性有3種做用域public、non-public和subclass API,能夠理解成C++中的public、private、protected,non-public屬性前,前綴一條下劃線。
類的屬性若與關鍵字名字衝突,後綴一下劃線,儘可能不要使用縮略等其餘方式。
爲避免與子類屬性命名衝突,在類的一些屬性前,前綴兩條下劃線。好比:類Foo中聲明__a,訪問時,只能經過Foo._Foo__a,避免歧義。若是子類也叫Foo,那就無能爲力了。
類的方法第一個參數必須是self,而靜態方法第一個參數必須是cls。

七 編碼建議
編碼中考慮到其餘python實現的效率等問題,好比運算符‘+’在CPython(Python)中效率很高,都是Jython中卻很是低,因此應該採用.join()的方式。
儘量使用‘is’‘is not’取代‘==’,好比if x is not None 要優於if x。
使用基於類的異常,每一個模塊或包都有本身的異常類,此異常類繼承自Exception。
異常中不要使用裸露的except,except後跟具體的exceptions。
異常中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)
使用startswith() and endswith()代替切片進行序列前綴或後綴的檢查。好比:
Yes: if foo.startswith('bar'):優於
No: if foo[:3] == 'bar':
使用isinstance()比較對象的類型。好比
Yes: if isinstance(obj, int): 優於
No: if type(obj) is type(1):
判斷序列空或不空,有以下規則
Yes: if not seq:
if seq:
優於
No: if len(seq)
if not len(seq)
字符串不要以空格收尾。
二進制數據判斷使用 if boolvalue的方式。github

9.經過代碼實現以下轉換:web

二進制轉換成十進制:v = 「0b1111011」

十進制轉換成二進制:v = 18

八進制轉換成十進制:v = 「011」

十進制轉換成八進制:v = 30

十六進制轉換成十進制:v = 「0x12」

十進制轉換成十六進制:v = 87

複製代碼
v1 = "0b1111011"
print(int(v1, 2))  # 123
v2 = 18
print(bin(v2))  # 0b10010
v3 = "011"
print(int(v3, 8))  # 9
v4 = 30
print(oct(v4))  # 0o36
v5 = "0x12"
print(int(v5, 16))  # 18
v6 = 87
print(hex(v6))  # 0x57
複製代碼

10.請編寫一個函數實現將IP地址轉換成一個整數

如 10.3.9.12 轉換規則爲: 10 00001010 3 00000011 9 00001001 12 00001100 再將以上二進制拼接起來計算十進制結果:00001010 00000011 00001001 00001100 = ?

複製代碼
ip = "10.3.9.12"

def exchange(ip):
    ip_list = ip.split(".")
    bin_num = "".join([str(bin(int(i))) for i in ip_list])
    bin_num = bin_num.replace("0b", "0000")
    print(bin_num)
    return int(bin_num, 2)

print(exchange(ip))
複製代碼

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,只規定了英文字母數字和一些特殊字符與數字的對應關係。最多隻能用 8 位來表示(一個字節),即:2**8 = 256,因此,ASCII碼最多隻能表示 256 個符號

ASCII:一個Bytes表明一個字符(英文字符/鍵盤上的全部其餘字符),1Bytes=8bit,8bit能夠表示0-2**8-1種變化,便可以表示256個字符

ASCII最初只用了後七位,127個數字,已經徹底可以表明鍵盤上全部的字符了(英文字符/鍵盤的全部其餘字符),後來爲了將拉丁文也編碼進了ASCII表,將最高位也佔用了

爲了知足中文和英文,中國人定製了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.字節碼和機器碼的區別?

機器碼(machine code),學名機器語言指令,有時也被稱爲原生碼(Native Code),是電腦的CPU可直接解讀的數據。

字節碼是一種中間狀態(中間碼)的二進制代碼(文件)。須要直譯器轉譯後才能成爲機器碼。

15.三元運算規則以及應用場景?

 三元運算符就是在賦值變量的時候,能夠直接加判斷,而後賦值

a = 1 
b = 2
c = a if a > 1 else b       # 若是a大於1的話,c=a,不然c=b

16.用一行代碼實現數值交換:
     
 a = 1
 
     b = 2

a,b = b,a

17.Python3和Python2中 int 和 long的區別?

python3去除了long類型,如今只有一種整型——int,但它的行爲就像python2版本的long

18.xrange和range的區別?

複製代碼
在python2中:

range([start,] stop[, step]),根據start與stop指定的範圍以及step設定的步長,生成一個序列
>>> range(5)
[0, 1, 2, 3, 4]
>>> range(1,5)
[1, 2, 3, 4]
>>> range(0,6,2)
[0, 2, 4]

xrange用法與range徹底相同,所不一樣的是生成的不是一個數組,而是一個生成器。
>>> xrange(5)
xrange(5)
>>> list(xrange(5))
[0, 1, 2, 3, 4]
>>> xrange(1,5)
xrange(1, 5)
>>> list(xrange(1,5))
[1, 2, 3, 4]
>>> xrange(0,6,2)
xrange(0, 6, 2)
>>> list(xrange(0,6,2))
[0, 2, 4]

由上面的示例能夠知道:要生成很大的數字序列的時候,用xrange會比range性能優不少,由於不須要一上來就開闢一塊很大的內存空間,這兩個基本上都是在循環的時候用。

在 Python 3 中,range() 是像 xrange() 那樣實現,xrange()被拋棄
複製代碼

19.文件操做時:xreadlines和readlines的區別?

 

20.列舉布爾值爲False的常見值?

0,空字典,空字符串,空列表

21.字符串、列表、元組、字典每一個經常使用的5個方法?

複製代碼
字符串
print(name.capitalize())       # 把字符串的第一個字符大寫
print(name.isspace())          # 是否包含空格
print(name.replace('Li', ''))  # 替換操做
print(name.split('m'))         # 分割操做,打印: ["I'a", ' LiChengGuan']
print(name.strip())            # 去掉字符串的左右空格
print(name.find('Li'))         # 查找,打印 5,即返回開始的索引值,不然返回-1
print(name.index('Li'))        # 查找,打印 5,即返回開始的索引值,沒有則拋異常

列表
s = [1, 2, 3, 4]
s1 = [5, 6, 7, 8]
 
s.extend(s1)             # 在列表末尾擴展另外一個列表
s.append('測試拼接')     # 列表末尾添加新的元素
s.insert(0, '測試拼接')  # 指定位置插入元素
s.pop(0)                 # 指定位置刪除,默認刪除最後一個
s.remove(3)              # 移除列表中某個值的第一個匹配項,沒有會拋異常
s.clear()                # 清空
s.reverse()              # 反向列表中元素

字典
print(dic.keys())      # 輸出全部鍵
print(dic.values())    # 輸出全部值
dic.pop('code')        # 刪除 code 鍵
dic.clear()            # 清空
del dic                # 刪除
複製代碼

22.lambda表達式格式以及應用場景?

簡單來講,編程中提到的 lambda 表達式,一般是在須要一個函數,可是又不想費神去命名一個函數的場合下使用,也就是指匿名函數,lambda是一個表達式

23.pass的做用?

pass是空語句,是爲了保持程序結構的完整性。pass 不作任何事情,通常用作佔位語句

24.*arg和**kwarg做用

這是一種特殊的語法,在函數定義中使用*args和kwargs傳遞可變長參數. *args用做傳遞非命名鍵值可變長參數(位置參數),如列表元祖; kwargs用做傳遞鍵值可變長參數,如字典.

25.is和==的區別

is 比較的是兩個實例對象是否是徹底相同,它們是否是同一個對象,佔用的內存地址是否相同。萊布尼茨說過:「世界上沒有兩片徹底相同的葉子」,這個is正是這樣的比較,比較是否是同一片葉子(即比較的id是否相同,這id相似於人的身份證標識)。

== 比較的是兩個對象的內容是否相等,即內存地址能夠不同,內容同樣就能夠了。這裏比較的並不是是同一片葉子,可能葉子的種類或者脈絡相同就能夠了。默認會調用對象的 __eq__()方法

26.簡述Python的深淺拷貝以及應用場景?

Python採用基於值得內存管理模式,賦值語句的執行過程是:首先把等號右側標識的表達式計算出來,而後在內存中找一個位置把值存放進去,最後建立變量並指向這個內存地址。Python中的變量並不直接存儲值,而是存儲了值的內存地址或者引用
簡單地說,淺拷貝只拷貝一層(若是有嵌套),深拷貝拷貝全部層

27.Python垃圾回收機制?

 

28.Python的可變類型和不可變類型?

不可變類型 : 基礎類型字符串,數字,布爾值,字節.另外還有一個元組
可變類型 : 數據結構列表,字典,集合

29.求結果:

   v = dict.fromkeys(['k1','k2'],[])
 
   v[‘k1’].append(666)

   print(v)

   v[‘k1’] = 777

   print(v)

{'k1': [666], 'k2': [666]}
{'k1': 777, 'k2': [666]}

30.求結果:

[6,6,6,6]

31.列舉常見的內置函數?

複製代碼
enumertae:枚舉,返回索引與值的元組
zip:拉鍊函數,接收多個可迭代對象,將對象相同索引位置放在一個元組中,返回一個迭代器,返回迭代器中元素個數由最短的可迭代對象決定
filter:過濾函數,接收一個函數和一個可迭代對象,生成一個迭代器.將可迭代對象的每個元素帶入函數中,若是返回結果爲True,則把元素添加入迭代器中
map:處理函數,接收一個函數和一個可迭代對象,生成一個迭代器,將可迭代對象的每個元素帶入函數中,把返回值添加入迭代器中
callble:判斷參數是否是可調用的
dir:查看內置屬性和方法的字符串
super:根據__mro__屬性去查找方法
isinstance:判斷一個對象是否是這個類實例化出來的
iscubclass:判斷一個類是否是另外一個類的子類,也能夠判斷兩個類是否是相同的類
property:在類中定義一個可控屬性
複製代碼

32.filter、map、reduce的做用?

functools.reduce
reduce把一個函數做用在一個序列[x1, x2, x3, ...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素作累積計算,
from functools import reduce
reduce(lambda x,y: x+y, [1, 2, 3])  # 6
reduce(lambda x, y: x+y, [1,2,3], 9)  # 15

33.一行代碼實現9*9乘法表

 

34.如何安裝第三方模塊?以及用過哪些第三方模塊?

pip 安裝
 
下載源碼包
先執行 python setup.py build
而後執行 python setup.py install

35.至少列舉8個經常使用模塊都有那些?

 

36.re的match和search區別?

match # 從頭開始匹配
search # 匹配第一個

37.什麼是正則的貪婪匹配?

複製代碼
import re
    
content = 'Hello 1234567 World_This is a Regex Demo'
result1 = re.match('^He.*(\d+).*Demo$', content) # 貪婪匹配,儘量多的匹配
result2 = re.match('^He.*?(\d+).*Demo$', content) # 非貪婪匹配,儘量少的匹配
  
print(result1.group(1)) # 7
print(result2.group(1)) # 1234567
複製代碼

38.求結果:
 a. [ i % 2 for i in range(10) ]
 b. ( i % 2 for i in range(10) )

a是一個列表
b是一個生成器

39.求結果:
 a. 1 or 2
 b. 1 and 2
 c. 1 < (2==2)
 d. 1 < 2 == 2

1,2,False,True

40.def func(a,b=[]) 這種寫法有什麼坑?

函數定義時生成默認b的列表,而不是每次調用時生成一個空列表

41.如何實現 「1,2,3」 變成 [‘1’,’2’,’3’] ?

a = '1,2,3'.split(',')
print(a)

42.如何實現[‘1’,’2’,’3’]變成[1,2,3] ?

[int(i) for i in ['1','2','3']]

43.比較: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的區別?

a,b沒有區別其中元素都是數字,c中元素是元祖

44.如何用一行代碼生成[1,4,9,16,25,36,49,64,81,100] ?

a = [i*i for i in range(1,11)]

45.一行代碼實現刪除列表中重複的值 ?

轉爲集合

46.如何在函數中設置一個全局變量 ?

global關鍵字

47.logging模塊的做用?以及應用場景?

logging用來記錄日誌
能夠自定製日誌的格式、級別及輸出形式

48.請用代碼簡答實現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[len(self.items)-1]   
  def size(self):       
    return len(self.items)
複製代碼

49.經常使用字符串格式化哪幾種?

%佔位符以及format方法

50.簡述 生成器、迭代器、可迭代對象 以及應用場景?

複製代碼
生成器 : 本身實現的迭代器
 
迭代器 : 調用next()方法,從中取值,或拋出一個異常.也有__iter__方法
 
可迭代對象 : 擁有__iter__方法,返回一個迭代器
 
應用場景 : 處理大量數據時逐個取值
複製代碼

51.用Python實現一個二分查找的函數。

複製代碼
li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def search(zhi,li,start=0,end=None):
    end = len(li) if end is None else end
    zj = (end - start) // 2+start
    if start<=end:
        if zhi>li[zj]:
            return search(3,li,start=zj+1,end=end)
        elif zhi<li[zj]:
            return search(3,li,start=start,end=zj-1)
        else:
            return zj
    return '找不到這個值'
print(search(8,li)
複製代碼

52.談談你對閉包的理解?

內部函數包含了對外部函數變量的引用

53.os和sys模塊的做用?

os : 系統相關

sys : 解釋器相關

54.如何生成一個隨機數?

random.randint()

55.如何使用python刪除一個文件?

os.remove()

56.談談你對面向對象的理解?

 

57.Python面向對象中的繼承有什麼特色?

58.面向對象深度優先和廣度優先是什麼?

執行方法的查找順序
在經典類中,是深度優先,先把一條線查完(棧,)
在新式類中,廣度優先(順着一條線查,若是還有別的路能夠查到一個類,這條路就終止了,換一條線查)
python3中都是新式類,在python中若是你建立了一個類,而且該類沒有繼承任意類,那麼他就是一個經典類

59.面向對象中super的做用?

按照mro的順序去查找並調用父類的方法

60.是否使用過functools中的函數?其做用是什麼?

常用他的裝飾器修復的函數functool.wraps,還有偏函數functools.partial

61.列舉面向對象中帶爽下劃線的特殊方法,如:__new__、__init__

複製代碼
__str__ :
__call__ :
 
__getattr__ :
__setattr__ :
 
__enter__ :
__exit__ :
 
__getitem__ :
__setitem__ :
__iter__ :
複製代碼

62.如何判斷是函數仍是方法?

print(isinstance(obj.func, FunctionType))   # False
print(isinstance(obj.func, MethodType))    # True

63.靜態方法和類方法區別?

靜態方法 : 至關於在類做用域下的普通函數,不進行與類或實例相關的操做

類方法 : 由類調用,進行與類有關的操做

64.列舉面向對象中的特殊成員以及應用場景

 

65.一、二、三、四、5 能組成多少個互不相同且無重複的三位數

66.什麼是反射?以及應用場景?

利用字符串獲取對象的屬性或方法,WEB框架的CBV,配置文件獲取類

67.metaclass做用?以及應用場景?

metaclass是類的產生類,而並不是繼承類
經過它來控制類的產生,以及類實例化的操做
wtform中實例化自定義form類時執行了其元類的__call__方法

68.用盡可能多的方法實現單例模式。

 

69.裝飾器的寫法以及應用場景。

70.異常處理寫法以及如何主動跑出異常(應用場景)

複製代碼
try:
    執行語句
except 異常類型:
    觸發異常後執行的語句
else:
    沒有觸發異常執行的語句
findlly:
    有沒有異常都執行的語句
 
# 主動拋出異常
raise 異常類實例
複製代碼

71.什麼是面向對象的mro

方法查找的順序

72.isinstance做用以及應用場景?

用於判斷一個對象是不是一個類或者其子類的實例。

73.寫代碼並實現:
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]

for i in range(len(_list)):
    for j in range(i,len(_list)):
        if _list[i]+_list[j] ==9:
            return i,j

74.json序列化時,能夠處理的數據類型有哪些?如何定製支持datetime類型?

複製代碼
字符串、列表、字典、數字、布爾值、None
自定義cls類
class MyEncoder(json.JSONEncoder):
    def default(self, o): # o是數據類型
        if isinstance(o,datetime.datetime):
            return o.strftime('%Y-%m-%d')
        else:
            return super(MyEncoder,self).default(o)
複製代碼

75.json序列化時,默認遇到中文會轉換成unicode,若是想要保留中文怎麼辦?

dumps時指定ensure_ascii=False

76.什麼是斷言?應用場景?

斷言條件爲真時代碼繼續執行,不然拋出異常,這個異常一般不會去捕獲他.咱們設置一個斷言目的就是要求必須實現某個條件

77.有用過with statement嗎?它的好處是什麼?

文件操做時使用過.
with語句下代碼完成後調用求值語句返回對象的__exit__方法,能夠實現一些操做,好比關閉文件

78.使用代碼實現查看列舉目錄下的全部文件。

複製代碼
# 遞歸的方式
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)
複製代碼

79.簡述 yield和yield from關鍵字。

yield : 生成器函數關鍵字
yield from : 至關於for i in obj : yield i

第二部分 網絡編程和併發(34題)

80.簡述 OSI 七層協議。

開放式系統互聯參考模型,從邏輯上將網絡劃分爲7層,它從低到高分別是:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。

ISO制定的OSI參考模型的過於龐大、複雜招致了許多批評。與此對照,由技術人員本身開發的TCP/IP協議棧得到了更爲普遍的應用

81.什麼是C/S和B/S架構?

c/s : 客戶端/服務端

b/s : 瀏覽器/服務端

82.簡述 三次握手、四次揮手的流程。

複製代碼
# 三次握手
客戶端 : 發出請求
服務端 : 收到請求並相應 # 說明服務端能夠收到客戶端的請求
客戶端 : 收到響應建立鏈接# 說明客戶端能夠收到服務端的請求
 
# 四次揮手
任意一方: 發出斷開鏈接請求
另外一方   : 收到響應,並回復
另外一方   : 發出斷開鏈接請求
任意一方: 收到響應,斷開鏈接
複製代碼

83.什麼是arp協議?

arp協議就是ip地址轉換爲MAC地址的協議

84.TCP和UDP的區別?

TCP : 通訊前建立鏈接

UDP : 通訊前不需建立鏈接

85.什麼是局域網和廣域網?

 

86.爲什麼基於tcp協議的通訊比基於udp協議的通訊更可靠?

TCP通訊前建立鏈接,確保了鏈接兩方可以接收到數據

87.什麼是socket?簡述基於tcp協議的套接字通訊流程。

複製代碼
socket位於應用層與傳輸層之間,實現了兩個相同主機或不一樣主機進程間的互相通訊
# 服務端
    建立TCP套接字對象
    綁定ip端口
    開始監聽請求
    接收發送數據
 
# 客戶端
    建立TCP套接字對象
    鏈接指定IP端口
    接收發送數據
複製代碼

88.什麼是粘包? socket 中形成粘包的緣由是什麼? 哪些狀況會發生粘包現象?

複製代碼
TCP是流式傳送的 也就是鏈接創建後能夠一直不停的發送 並無明確的邊界定義.
發送端-接收端都存在這一個緩衝區
 
由接收方形成的粘包
   當接收方不能及時接收緩衝區的包,形成多個包接收就產生了粘包
       客戶端發送一段數據,服務端只收了一小部分,服務端下次再收的時候仍是從緩衝區拿上次
       遺留的數據
由傳輸方形成的粘包
  tcp協議中會使用Nagle算法來優化數據。發送時間間隔短,數據量小的包會一塊兒發送,形成粘包
複製代碼

89.IO多路複用的做用?

監聽多個soket的狀態變化

90.什麼是防火牆以及做用?

它是一種位於內部網絡與外部網絡之間的網絡安全系統。一項信息安全的防禦系統,依照特定的規則,容許或是限制傳輸的數據經過。
 
防火可使企業內部局域網(LAN)網絡與Internet之間或者與其餘外部網絡互相隔離、限制網絡互訪用來保護內部網絡。

91.select、poll、epoll 模型的區別?

selete : 有最大鏈接數 遍歷         支持win
poll :    無最大鏈接數  遍歷        支持win
epoll :  無最大鏈接數  事件通知   不支持win

92.簡述 進程、線程、協程的區別 以及應用場景?

複製代碼
# 進程
一個任務,進程之間內存隔離,一個進程修改數據不會影響其餘進程(建立變量,修改變量值)
# 線程
線程位於進程內
一個進程內至少有一個線程,線程之間資源共享.一個線程修改數據其餘進程也會受影響因此有了鎖的概念
# 協程
代碼級別的保存狀態+切換
 
多線程,協程用於IO密集型,如socket,爬蟲,web,搶佔cpu資源
多進程用於計算密集型,如金融分析,利用多核優點
複製代碼

93.GIL鎖是什麼鬼?

Cpython解釋器的一把鎖,同一時間只容許一個進程中的一個線程執行

94.Python中如何使用線程池和進程池?

95.threading.local的做用?

建立一個對象,每一個線程爲該對象設置值數據都是隔離的

96.進程之間如何進行通訊?

中間介質
socket : 直接通訊

97.什麼是併發和並行?

併發 : 看上去是在同時工做,其實是cpu一直在切換着工做

並行 : 利用多核同時工做多個任務

98.進程鎖和線程鎖的做用?

進程鎖 : 防止進程同時操做一套文件系統

線程鎖 : 防止多個線程同時修改進程內數據

99.解釋什麼是異步非阻塞?

# 非阻塞和阻塞的概念相對應,指在不能馬上獲得結果以前也會馬上返回,同時該函數不會阻塞當前線程
 
#異步的概念和同步相對。當一個異步功能調用發出後,調用者不能馬上獲得結果。當該異步功能完成後,
# 經過狀態、通知或回調來通知調用者。

100.路由器和交換機的區別?

路由器 : 鏈接外部網絡,有接入外部的線

交換機 : 鏈接內部網絡,沒有接入外部的線

101.什麼是域名解析?

咱們在瀏覽器上輸入網站域名時,會去請求DNS服務器獲取該域名對應的IP地址,再去訪問改地址

102.如何修改本地hosts文件?

win : C:\Windows\System32\drivers\etc\hosts 

linux : /etc/hosts

按格式修改便可

103.生產者消費者模型應用場景及優點?

複製代碼
生產者與消費者模式是經過一個容器來解決生產者與消費者的強耦合關係,生產者與消費者之間不直接進行通信,
而是利用阻塞隊列來進行通信,生產者生成數據後直接丟給阻塞隊列,消費者須要數據則從阻塞隊列獲取,實際應
用中,生產者與消費者模式則主要解決生產者與消費者生產與消費的速率不一致的問題,達到平衡生產者與消費者
的處理能力,而阻塞隊列則至關於緩衝區。
 
# 應用場景
由一個線程生成訂單,並將其放入隊列中.由多個線程去處理
 
# 優點
平衡生產者與消費者的處理能力
複製代碼

104.什麼是cdn?

複製代碼
CDN的全稱是Content Delivery Network,即內容分發網絡。
其基本思路是儘量避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。
 
經過在網絡各處放置節點服務器所構成的在現有的互聯網基礎之上的一層智能虛擬網絡,CDN系統可以實時地根
據網絡流量和各節點的鏈接、負載情況以及到用戶的距離和響應時間等綜合信息將用戶的請求從新導向離用戶最近
的服務節點上。
 
其目的是使用戶可就近取得所需內容,解決 Internet網絡擁擠的情況,提升用戶訪問網站的響應速度。
複製代碼

105.LVS是什麼及做用?

LVS的英文全稱是Linux Virtual Server,即Linux虛擬服務器
 
LVS主要用於多服務器的負載均衡。它工做在網絡層,能夠實現高性能,高可用的服務器集羣技術。它廉價,可把
許多低性能的服務器組合在一塊兒造成一個超級服務器。它易用,配置很是簡單,且有多種負載均衡的方法。它穩定
可靠,即便在集羣的服務器中某臺服務器沒法正常工做,也不影響總體效果。另外可擴展性也很是好

106.Nginx是什麼及做用?

 

107.keepalived是什麼及做用?

108.haproxy是什麼以及做用?

109.什麼是負載均衡?

110.什麼是rpc及應用場景?

111.簡述 asynio模塊的做用和應用場景。

112.簡述 gevent模塊的做用和應用場景。

113.twisted框架的使用和應用?

第三部分 數據庫和緩存(46題)

114.列舉常見的關係型數據庫和非關係型都有那些?

115.MySQL常見數據庫引擎及比較?

116.簡述數據三大範式?

117.什麼是事務?MySQL如何支持事務?

118.簡述數據庫設計中一對多和多對多的應用場景?

119.如何基於數據庫實現商城商品計數器?

常見SQL(必備)
詳見武沛齊博客:https://www.cnblogs.com/wupeiqi/articles/5729934.html

120.簡述觸發器、函數、視圖、存儲過程?

121.MySQL索引種類

122.索引在什麼狀況下遵循最左前綴的規則?

123.主鍵和外鍵的區別?

124.MySQL常見的函數?

125.列舉 建立索引可是沒法命中索引的8種狀況。

126.如何開啓慢日誌查詢?

127.數據庫導入導出命令(結構+數據)?

128.數據庫優化方案?

129.char和varchar的區別?

130.簡述MySQL的執行計劃?

131.在對name作了惟一索引前提下,簡述如下區別:
 
        select * from tb where name = ‘Oldboy-Wupeiqi’ 
 
        select * from tb where name = ‘Oldboy-Wupeiqi’ limit 1

132.1000w條數據,使用limit offset 分頁時,爲何越日後翻越慢?如何解決?

133.什麼是索引合併?

134.什麼是覆蓋索引?

135.簡述數據庫讀寫分離?

136.簡述數據庫分庫分表?(水平、垂直)

137.redis和memcached比較?

138.redis中數據庫默認是多少個db 及做用?

139.python操做redis的模塊?

140.若是redis中的某個列表中的數據量很是大,若是實現循環顯示每個值?

141.redis如何實現主從複製?以及數據同步機制?

142.redis中的sentinel的做用?

143.如何實現redis集羣?

144.redis中默認有多少個哈希槽?

簡述redis的有哪幾種持久化策略及比較?

列舉redis支持的過時策略。

MySQL 裏有 2000w 數據,redis 中只存 20w 的數據,如何保證 redis 中都是熱點數據? 

寫代碼,基於redis的列表實現 先進先出、後進先出隊列、優先級隊列。

如何基於redis實現消息隊列?

如何基於redis實現發佈和訂閱?以及發佈訂閱和消息隊列的區別?

什麼是codis及做用?

什麼是twemproxy及做用?

寫代碼實現redis事務操做。

redis中的watch的命令的做用?

基於redis如何實現商城商品數量計數器?

簡述redis分佈式鎖和redlock的實現機制。

什麼是一致性哈希?Python中是否有相應模塊?

如何高效的找到redis中全部以oldboy開頭的key?

第四部分 前端、框架和其餘(155題)

談談你對http協議的認識。

談談你對websocket協議的認識。

什麼是magic string ?

如何建立響應式佈局?

你曾經使用過哪些前端框架?

什麼是ajax請求?並使用jQuery和XMLHttpRequest對象實現一個ajax請求。

如何在前端實現輪訓?

如何在前端實現長輪訓?

vuex的做用?

vue中的路由的攔截器的做用?

axios的做用?

列舉vue的常見指令。

簡述jsonp及實現原理?

是什麼cors ?

列舉Http請求中常見的請求方式?

列舉Http請求中的狀態碼?

列舉Http請求中常見的請求頭?

看圖寫結果:

看圖寫結果:

看圖寫結果:

看圖寫結果:

看圖寫結果:

看圖寫結果:

django、flask、tornado框架的比較?

什麼是wsgi?

django請求的生命週期?

列舉django的內置組件?

列舉django中間件的5個方法?以及django中間件的應用場景?

簡述什麼是FBV和CBV?

django的request對象是在何時建立的?

如何給CBV的程序添加裝飾器?

列舉django orm 中全部的方法(QuerySet對象的全部方法)

only和defer的區別?

select_related和prefetch_related的區別?

filter和exclude的區別?

列舉django orm中三種能寫sql語句的方法。

django orm 中如何設置讀寫分離?

F和Q的做用?

values和values_list的區別?

如何使用django orm批量建立數據?

django的Form和ModeForm的做用?

django的Form組件中,若是字段中包含choices參數,請使用兩種方式實現數據源實時更新。

django的Model中的ForeignKey字段中的on_delete參數有什麼做用?

django中csrf的實現機制?

django如何實現websocket?

基於django使用ajax發送post請求時,均可以使用哪一種方法攜帶csrf token?

django中如何實現orm表中添加數據時建立一條日誌記錄。

django緩存如何設置?

django的緩存能使用redis嗎?若是能夠的話,如何配置?

django路由系統中name的做用?

django的模板中filter和simple_tag的區別?

django-debug-toolbar的做用?

django中如何實現單元測試?

解釋orm中 db first 和 code first的含義?

django中如何根據數據庫表生成model中的類?

使用orm和原生sql的優缺點?

簡述MVC和MTV

django的contenttype組件的做用?

談談你對restfull 規範的認識?

接口的冪等性是什麼意思?

什麼是RPC?

Http和Https的區別?

爲何要使用django rest framework框架?

django rest framework框架中都有那些組件?

django rest framework框架中的視圖均可以繼承哪些類?

簡述 django rest framework框架的認證流程。

django rest framework如何實現的用戶訪問頻率控制?

Flask框架的優點?

Flask框架依賴組件?

Flask藍圖的做用?

列舉使用過的Flask第三方組件?

簡述Flask上下文管理流程?

Flask中的g的做用?

Flask中上下文管理主要涉及到了那些相關的類?並描述類主要做用?

爲何要Flask把Local對象中的的值stack 維護成一個列表?

Flask中多app應用是怎麼完成?

在Flask中實現WebSocket須要什麼組件?

wtforms組件的做用?

Flask框架默認session處理機制?

解釋Flask框架中的Local對象和threading.local對象的區別?

Flask中 blinker 是什麼?

SQLAlchemy中的 session和scoped_session 的區別?

SQLAlchemy如何執行原生SQL?

ORM的實現原理?

DBUtils模塊的做用?

如下SQLAlchemy的字段是否正確?若是不正確請更正:

1

2

3

4

5

6

7

8

9

10

11

fromdatetime importdatetime

fromsqlalchemy.ext.declarative

importdeclarative_base

fromsqlalchemy importColumn, Integer, String, DateTime





Base =declarative_base()



classUserInfo(Base):
   

    __tablename__ ='userinfo'
   

    id=Column(Integer, primary_key=True, autoincrement=True)


    name =Column(String(64), unique=True)


    ctime =Column(DateTime, default=datetime.now())

SQLAchemy中如何爲表設置引擎和字符編碼?

SQLAchemy中如何設置聯合惟一索引?

簡述Tornado框架的特色。

簡述Tornado框架中Future對象的做用?

Tornado框架中如何編寫WebSocket程序?

Tornado中靜態文件是如何處理的?
如: <link href="{{static_url("commons.css")}}" rel="stylesheet" />

Tornado操做MySQL使用的模塊?

Tornado操做redis使用的模塊?

簡述Tornado框架的適用場景?

git常見命令做用:

簡述如下git中stash命令做用以及相關其餘命令。

git 中 merge 和 rebase命令 的區別。

公司如何基於git作的協同開發?

如何基於git實現代碼review?

git如何實現v1.0 、v2.0 等版本的管理?

什麼是gitlab?

github和gitlab的區別?

如何爲github上牛逼的開源項目貢獻代碼?

git中 .gitignore文件的做用?

什麼是敏捷開發?

簡述 jenkins 工具的做用?

公司如何實現代碼發佈?

簡述 RabbitMQ、Kafka、ZeroMQ的區別?

RabbitMQ如何在消費者獲取任務後未處理完前就掛掉時,保證數據不丟失?

RabbitMQ如何對消息作持久化?

RabbitMQ如何控制消息被消費的順序?

如下RabbitMQ的exchange type分別表明什麼意思?如:fanout、direct、topic。

簡述 celery 是什麼以及應用場景?

簡述celery運行機制。

celery如何實現定時任務?

簡述 celery多任務結構目錄?

celery中裝飾器 @app.task 和 @shared_task的區別?

簡述 requests模塊的做用及基本使用?

簡述 beautifulsoup模塊的做用及基本使用?

簡述 seleninu模塊的做用及基本使用?

scrapy框架中各組件的工做流程?

在scrapy框架中如何設置代理(兩種方法)?

scrapy框架中如何實現大文件的下載?

scrapy中如何實現限速?

scrapy中如何實現暫定爬蟲?

scrapy中如何進行自定製命令?

scrapy中如何實現的記錄爬蟲的深度?

scrapy中的pipelines工做原理?

scrapy的pipelines如何丟棄一個item對象?

簡述scrapy中爬蟲中間件和下載中間件的做用?

scrapy-redis組件的做用?

scrapy-redis組件中如何實現的任務的去重?

scrapy-redis的調度器如何實現任務的深度優先和廣度優先?

簡述 vitualenv 及應用場景?

簡述 pipreqs 及應用場景?

在Python中使用過什麼代碼檢查工具?

簡述 saltstack、ansible、fabric、puppet工具的做用?

B Tree和B+ Tree的區別?

請列舉常見排序並經過代碼實現任意三種。

請列舉常見查找並經過代碼實現任意三種。

請列舉你熟悉的設計模式?

有沒有刷過leetcode?

列舉熟悉的的Linux命令。

公司線上服務器是什麼系統?

解釋 PV、UV 的含義?

解釋 QPS的含義?

uwsgi和wsgi的區別?

supervisor的做用?

什麼是反向代理?

簡述SSH的整個過程。

有問題都去那些找解決方案?

是否有關注什麼技術類的公衆號?

最近在研究什麼新技術?

是否瞭解過領域驅動模型?

相關文章
相關標籤/搜索