主頁 > 後端開發 > 研究了幾百套面試題,總結了幾道必考題,免費送給大家

研究了幾百套面試題,總結了幾道必考題,免費送給大家

2020-12-11 07:15:59 後端開發

#### 1.python字串格式化中,%s和.format的主要區別是什么

python用一個tuple將多個值傳遞給模板,每個值對應一個格式符
print(“ my name is %s ,im %d year old”%("gaoxu",19))
自從python2.6開始,新增了一種格式化字串的函式str.format(),通過{}和.來代替傳統的%
主要的區別是:不需要指定的字串還是數字型別

```
print('ma name is {} ,age is {} year old'.format("小明",17))
print('my name is {1},age is {0}'.format(15,'小明')) #:位置攢參的方式
li=['hollo',18]
print('may name is {0},my year old is {1}'.format(*li))
# 按照關鍵字傳參
hash={'name':'hoho','age':18}
print ('my name is {name},age is {age}'.format(**hash))

```

#### 2.現有兩個元組,(('a'),('b')),(('c'),('d'))請用匿名函式把他變成[{'a':'c'},{'b':'d'}]

```
t1=(('a'),('b'))
t2=(('c'),('d'))
res=lambda t1,t2:[{i:j}for i,j in zip(t1,t2)]
print(res(t1,t2))

```

#### 3.如何給串列去重并保持原來的順序不變

```
l=[11,2,3,4,7,6,4,3,54,3,]
now_l=[]
for i in l:
if i not in now_l:
now_l.append(i)
print(now_l)
也可以用set直接去重和排序print(set(l)

```

#### 4.解釋什么是匿名函式,它有什么好處

匿名函式與函式有共同的作用域,但是匿名函式意味著參考計數為0除非讓他有名字
好處:一次性使用,隨時隨地的定義更容易閱讀,做了什么更是一目了然

###### 為什么匿名函式沒有陳述句?

是被用于在代碼被執行的時候構建新的函式物件并且回傳

#### 5.python如何書寫可變引數和關鍵字引數

在python中定義函式,可也用必選函式,默認引數,可變引數,和關鍵字引數,這四種引數都可以一塊使用,或者只用其中的一些但是請注意的是引數定義的順序必須是必選引數,默認引數,可變引數,關鍵字引數

#### 6.python模塊中match和search的區別

re.match()總是匹配的是字串的開頭,并回傳匹配的math物件,如果去匹配字串非開頭的部分就會回傳none
re.search()函式對整個字串進行搜索,并回傳第一個匹配字串的match物件

#### 7\. 1 and 2和1 or2輸出結果是什么

python中的and是從左往右計算的,若所有的值都是真的,則回傳最后一個,若存在假的,返第一個假的,1 or 2因為是1是非零,所以回傳的值是1

#### 8.,示例說明args和**kwargs

*args(表示的就是將實參中按照位置傳參,多余的都是給args,切都是以元組的方式實作)
**kwargs:(表示的是按照關鍵字傳參,保存的是字典的形式

#### 9.寫出列印結果

```
print((i%2 for i in range(10))) #:<generator object <genexpr> at 0X000001c577DDE258>
print([i%2 for i in range(10)]) [0,,1,0,1,0,1,0,1]

```

總結:
1,把串列決議【】換成()得到生成器運算式
2,串列決議和生成器運算式都是一種便利的編程方式,只不過生成器運算式更節省記憶體
3,pyrhon不但使用迭代器協議,讓for回圈變得更加通用,大部分內置函式,也是使用迭代器協議
訪問物件的,列如:sun是python的內置函式,該函式使用迭代器協議訪問物件,而生成器實作了迭代器協議

#### 10.python2和python3的區別

python3的位元組是python2的字串
python3的字符竄是python2的unciode
在python3中print要加括號
在python3中數字除法有小數點

#### 11.請描述unIcode,utf-8,gbk之間的關系

```
Unicode--->encode----->utf-8
utf-------->decode------>unicode

```

#### 12.迭代器,生成器,裝飾器

迭代器即迭代工具,那么什么是迭代那
迭代重復上一個重復的程序,每一次重復即一次迭代,并且每一次迭代的結果都是下一次迭代的開始
為何要用迭代器
對于序列型別:字串,串列,元組,我們可以使用索引的方式迭代取出包含的元素
對于字典,集合,檔案等型別沒有索引,若還行取出內部包的元素,則需要找出不依賴索引的方式,那這就是迭代器
什么是可迭代的物件,具有**init**方法回傳就是迭代器,具有next方法
特點優點:提供了一種不依賴索引的取值的方式
缺點: 只能往前回圈,不能往后找無法獲取長度,
注意的是:迭代器物件一定是可迭代物件,但可迭代物件不一定是迭代器的物件
生成器迭代器的一種關鍵字yield+關鍵字,next方法,yield陳述句一次回傳一個結果,在每個
結果中間掛起鉤子函式,以便下次重它離開的地方繼續
生成器運算式類似于串列推導式,但是生成器回傳按需求產生結果的一個物件,而不是一次構建
一個結果的串列
特點:惰性運算,節省空間
裝飾器:在不改變原來函式和函式的呼叫方式進行擴展,就是對外開放,對內封閉的原則
目標:為被裝飾的物件添加新的功能

#### 13.def func(a,b=[])這樣寫有什么陷阱?

Python函式在定義的時候,默認b的值就被計算出來了,即[],因為默認引數b也是一個變數,它指向
物件即[],每次呼叫這個函式,如果改變b的內容每次呼叫時候默認引數也就改變了,不在是定義時候的[]了

![image](//upload-images.jianshu.io/upload_images/8562039-226a56ef7813e2fa.png?imageMogr2/auto-orient/strip|imageView2/2/w/700/format/webp)

所以默認引數要牢記一點:默認引數必須指向不變物件

#### 14.python實作9乘9乘法兩種方法?

```
for i in range(1,10):
for j in range(1,i+1):
print('%s * %s= %s'%(i,j,i*j),end="")
print('')

```

```
print( '\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)])for x in range(1,10)]))

```

#### 15.如何在python中拷貝一個物件,并說出他們的區別

拷貝有兩種方式:淺拷貝和深拷貝copy.copy()and copy.deepcopy()
我們尋常意義上的復制就是深復制,即將被復制的物件完全再復制一遍作為獨立的新個體單獨存在,所以
改變原有被復制的到物件不會對已經復制的新物件產生影響,
而淺復制并不會產生一個獨立的物件存在,他只是將原有的資料打上一塊新標簽,所以當其中一塊標簽被
改變時候,資料就會變化,另一個標簽也會隨之改變,資料塊就發生變化,另一個標簽也會隨著改變,

![image](//upload-images.jianshu.io/upload_images/8562039-e2efc7ff2c44dd8e.png?imageMogr2/auto-orient/strip|imageView2/2/w/700/format/webp)

#### 16.談談你對python裝飾器的理解

裝飾器本質上就是一個python函式,它可以讓其他函式在不需要任何代碼變動的前提下增加額外的功能
,裝飾器的回傳值也是一個函式物件,她有很多的應用場景,比如:插入日志,事物處理,快取,權限裝飾器就是為已經存在的物件
添加額外功能

```
def outher(func):
def good(*args,**kwargs):
ret=func(*args,**kwargs)
return ret
return good
@outher
def bar():
print('狗241131313')
bar()

```

#### 17.python基礎:

計算串列中的元素的個數和向末尾追加元素所用到的方法?len(),append()
判斷字典中有沒有某個key的方法?用到get('key')方法,若沒有,將回傳值none
現有my_list=range(100)

#### 18.簡述python中垃圾回識訓制

主要是以物件參考計數為主標記清除和分帶技術為輔的那么一種方式
Python在記憶體中存盤了每個物件的參考計數(reference count),如果計數值變為0,那么相應的物件就會消失,分配給該物件的記憶體就會釋放出來用作他用,
偶爾也會出現參考回圈,垃圾回收器會定時尋找這個回圈,并將其回收,
Python中還使用了某些啟示演算法來加速回收,

#### 19.如何判斷一個變數是否是字串

```
a='sadsadada'
print(isinstasnce(a,str))

```

#### 20.Differences between list and tuple in python link:

[http://www.hacksparrow.com/python-difference-between-list-and-tuple.html](https://link.jianshu.com?t=http%3A%2F%2Fwww.hacksparrow.com%2Fpython-difference-between-list-and-tuple.html)

#### 21.range和xrange的區別

首先xrange在python3中已經不適用了
range:
函式說明:range([start,]stop[,step]),根據start與stop指定的范圍以及step設定的步長
生成一個串列
xrange與range類似,只是回傳的是一個“xrange object"物件,而非陣列list
要生成很大的數字序列的時候,用xrange會比range性能優很多
區別:range會生成一個list物件,而xrange會回傳一個生成器物件

#### 22.'1','2','3'如何變成['1','2','3']?

```
x='1','2','3'
li=[]
for i in x:
li .append(i)
print(li)
'1','2','3' 如何變成[1,2,3]
x='1','2','3'
li=[]
for i in x:
li .append(int(i))
print(li)

```

#### 23.一行實作[1,4,9,16,25,36,49,81,100]

```
target=list(map(lambda x: x*x,[1,2,3,4,5,6,7,8,9,10]

```

#### 24.print(map(str,[1,2,3,4])))輸出的是什么

map obj

#### 25.請解釋Python中的statimethod(靜態方法)和classmethod(類方法),

并補全下面的代碼

![image](//upload-images.jianshu.io/upload_images/8562039-56c56335c2f5cd58.png?imageMogr2/auto-orient/strip|imageView2/2/w/787/format/webp)

#### 26.如何用python洗掉一個檔案?

```
import os
os.remove(r'D:\ggg\fileobj)
os.remove(‘路徑’)

```

#### 27.面向物件

]([https://upload-images.jianshu.io/upload_images/8562039-d872b16188d4ba64.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240](https://link.jianshu.com?t=https%3A%2F%2Fupload-images.jianshu.io%2Fupload_images%2F8562039-d872b16188d4ba64.png%3FimageMogr2%2Fauto-orient%2Fstrip%257CimageView2%2F2%2Fw%2F1240))

#### 28.python如何生成亂數

```
import random
print(random.randint(1,10))

```

#### 29.如何在function里面設定一個全域變數

![image](//upload-images.jianshu.io/upload_images/8562039-9f14e3fd1888f762.png?imageMogr2/auto-orient/strip|imageView2/2/w/781/format/webp)

#### 30.請用python寫一個獲取用戶輸入數字,并根據數字大小輸出不同腳本資訊

![image](//upload-images.jianshu.io/upload_images/8562039-3cebeaa8630a0b25.png?imageMogr2/auto-orient/strip|imageView2/2/w/790/format/webp)

#### 31.請解釋生成器和函式的不同,并實作簡單的生成器與函式

```
# def beautiful(c):
# for i in range(c):
# yield i**2
# for item in beautiful(5):
# print(item)
#函式
# def gensquares(N):
# res=[0]
# for i in range(N):
# res.append(i*i)
# return res
# for item in gensquares(5):
# print(item)

```

總結:
1語法上和函式類似:生成器函式和常規函式幾乎一模一樣的,他們都是使用def陳述句進行
定義,區別在于,生成器使用yield陳述句回傳一個值,而常規函式使用return陳述句回傳一個值
2.自動實作迭代器的協議:對于生成器,python自動實作迭代器協議,所以我們可以呼叫它的next
方法,并且在沒有值回傳的時候,生成器自動生成Stopltwration例外
3.狀態掛起,生成器使用yield陳述句回傳一個值.yield陳述句掛起該生成器函式的狀態,保留足夠的資訊,方便之后離開的
地方繼續執行

#### 38.輸入一個字串,列印結果為倒敘

```
a=input('please enter a string')
print(a[::-1])

```

#### 32.請寫出自己的計算方法,按照升序合并如下串列

```
list1=[2,3,4,9,6]
list2=[5,6,10,17,11,2]
list1.extend(list2)
print(sorted(list(set(list))))
####33.到底什么是python?你可以在回答中進行技術對比(也鼓勵這樣做),
python是一門解釋性語言,這里說與c語言和c的衍生語言不同,python代碼不需要編譯,其他解釋語言還包括Ruby和pyp
python是動態語言,在宣告變數的時候,不需要宣告變數的型別
python非常適合面向物件編程,因為它支持通過組合和繼承的方式定義類
python代碼撰寫快,但是運行速度比編譯語言通常要慢,好在python允許加入基于c語言撰寫擴展,因此我們能優化代碼,消除瓶頸,這點通常是可以實作的numpy就是一個很好的例子
python用途很廣泛----網路應用,自動化,科學建模,大資料應用,等等通常被稱為膠水語言

```

#### 34.http狀態碼的不同,列出你所知道的http狀態碼,然后講出他們都是什么意思

狀態代碼有三位數字組成,第一個數字定義回應的類別,共分5種型別
1xx:提示資訊--表示請求接受,繼續處理
2xx:成功表示請求成功接收,理解,接受
3xx:重定向要完成請求必須更進一步操作
4xx:客戶端錯誤,請求有語法錯誤或請求無法實作
5xx:服務器端錯誤--服務器沒有實作合法請求
常見狀態碼:

```
200 OK//客戶端請求成功
400 Bad Request//客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized//請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden//服務器收到請求,但是拒絕提供服務
404 Not Found//請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error//服務器發生不可預期的錯誤
503 Server Unavailable//服務器當前不能處理客戶端的請求,一段時間后可能恢復正常

```

#### 34.lambda運算式和串列推導式

```
l2=[lambda:i for i in range(10)]
l1=[i for i in range(10)]
print(l1[0])
print(l2[0])
print(l2[0]())

```

#### 35.eval和exce的區別

eval有回傳值
exec沒有回傳值

```
print(eval('2+3'))
print(exec('2+1'))
exec("print('1+1')")

```

###### eval還可以將字串轉化成物件

```
class obj(object):
pass
a = eval('obj()')
print(a,type(a)) #<__main__.obj object at 0x000001F1F6897550> <class '__main__.obj'>

```

#### 36.cookie和session的區別

session在服務器,cooking在客戶端(瀏覽器)
session默認存在服務器上的檔案里面(也可以是記憶體,資料庫)
session的運行依賴session_id,而session_id是存在cookie中,也就是說,若果瀏覽器禁用lcookie,同時session也會失效(但是可以通過其他方式實作,比如在url中傳入session_id)
session可以放在檔案,資料庫,記憶體中都可以的
用戶驗證通常會用session
維持一個會話核心就是客戶端的唯一標識,即session_id

#### 37.http是有狀態協議還是無狀態協議?如何從兩次請求判斷是否是同一用戶?

無狀態協議,判斷session_id是否相同,

#### 38.有一組陣列[3,4,1,2,5,6,6,5,4,3,3]請寫一個函式,找出該陣列中

沒有重復的數的總和

```
def MyPlus(l):
new_l = []
for i in l:
if i not in new_l:
new_l.append(i)
return sum(new_l)
print(MyPlus(l = [2,3,4,4,5,5,6,7,8]))

```

#### 39.Python一行print出1-100的偶數串列:

```
print(i for i in range(1,100)if i%2 ==0])

```

#### 40.1,2,3,4,5能組成多少個互不相同且無重復的元素?

```
nums = [] for i in range(1,6): for j in range(1,6): for k in range(1,6): if i != j and j != k and i !=k: new_num = i*100 + k*10 + j if new_num not in nums: nums.append(new_num) print(nums)

```

#### 41.請寫出五中不同的http的請求方法:

get,post,put,delete,head,connect

#### 42.描述多行程開發中的join與daemon的區別

守護行程(daemon)
主行程創建守護行程
其一:守護行程會在主行程代碼執行結束后就終止
其二:守護行程內無法開啟子行程,否則拋出例外:AssertionError: daemonic processes are not allowed to have children
注意:行程之間是相互獨立的,主行程的代碼運行結束,守護行程隨即終止
p.join([timeout]): 主行程等待相應的子行程p終止(強調:是主執行緒處于等的狀態,而p是處于運行的狀態),需要強調的是p.join()只能join住start開始的行程,而不能join住run開啟的行程

#### 43.簡述GRL對python的影響

由于GIL的影響,python無法利用多核優勢
CIL本質就是一把互斥鎖,既然是互斥鎖,所有互斥鎖都一樣將并發運行轉化為串行,此時來控制同一時間內只能被一個任務修改,進而保證資料的安全.可以肯定的是:保護不同資料的安全,需要加不同的鎖,
現在計算機基本都是多核,python對于計算密集型任務開多執行緒的效率并不能帶來多大的技術提升,甚至不如串行(沒有大量的切換),但是對于io密集型任務效率還是有顯著的提升的
因此,對于io密集型任務,python多執行緒更加的適合,

#### 44.執行python腳本的兩種方式

```
./run.py.shell直接呼叫python腳本
python run.py 呼叫python 解釋器來呼叫python腳本

```

#### 45.TCP協議和UDP協議的區別是什么?

1、TCP協議是有連接的,有連接的意思是開始傳輸實際資料之前TCP的客戶端和服務器端必須通過三次握手建立連接,會話結束后也要結束連接,而UDP是無連接的
2、TCP協議保證資料發送,按序送達,提供超時重傳保證資料可靠性,但是UDP不保證按序到達,甚至不能保證到達,還是努力交付,即便是按序發送的序列,也不保證按序送到,
3、TCP協議所需資源多,TCP首部需20個位元組(不算可選項),UDP首部欄位只需8個位元組,
4、TCP有流量控制和擁塞控制,UDP沒有,網路擁堵不會影響發送端的發送速率,
5、TCP面向的位元組流的服務,UDP面向的是報文的服務,

三次握手建立連接時,發送方再次發送確認的必要性?
主 要是為了防止已失效的連接請求報文段突然又傳到了B,因而產生錯誤,假定出現一種例外情況,即A發出的第一個連接請求報文段并沒有丟失,而是在某些網路結 點長時間滯留了,一直延遲到連接釋放以后的某個時間才到達B,本來這是一個早已失效的報文段,但B收到此失效的連接請求報文段后,就誤認為是A又發出一次 新的連接請求,于是就向A發出確認報文段,同意建立連接,假定不采用三次握手,那么只要B發出確認,新的連接就建立了,這樣一直等待A發來資料,B的許多 資源就這樣白白浪費了,

四次揮手釋放連接時,等待2MSL的意義?
第 一,為了保證A發送的最有一個ACK報文段能夠到達B,這個ACK報文段有可能丟失,因而使處在LAST-ACK狀態的B收不到對已發送的FIN和ACK 報文段的確認,B會超時重傳這個FIN和ACK報文段,而A就能在2MSL時間內收到這個重傳的ACK+FIN報文段,接著A重傳一次確認,
第二,就是防止上面提到的已失效的連接請求報文段出現在本連接中,A在發送完最有一個ACK報文段后,再經過2MSL,就可以使本連接持續的時間內所產生的所有報文段都從網路中消失,

###### 46.一句話總結tcp和udp的區別

tcp是面向連接的,可靠的位元組流服務,udp是面向無連接的,不可靠而資料服務

#### 47.python有如下一個字典

python有如下的字典,
dic_tmp={'carry':17,'bob':21,'matty':23,'jack':33,'tom':17,'alex':23}

```
print(sorted(dic_tmp.items(),key=lambda dic_tmp:dic_tmp[0]))

```

#### 48.簡述inndb和myisam的特點:

innodb是mysql最常用的一種存盤引擎,Facebook,google等公司的成功已證明了innodb存盤引擎具有高可用性,高性能以及高擴展性,支持事物,其特點是行鎖設計,支持外鍵,并支持類似oracle的非鎖定讀,對于表中資料的存盤,inndb存盤引擎采用了聚集的方式,每張表都是按主鍵的順序進行存盤的,如果沒有顯示地在表定義時候指定主鍵,innodb,存盤引擎會為每一行生成六個位元組的ROWId,并以此為主鍵,
myisam不支持事物,表鎖設計,支持全文索引,主要面向一些olap資料庫應用,此外myisam存盤引擎的另一個與眾不同的地方是,它的緩沖池只快取索引檔案,而不快取資料檔案,這與大多數資料庫不一樣

#### 49.利用python背景關系管理器,實作一個寫入檔案的功能(寫入內容為'hello world')

```
class Open(object):
def __init__(self,name,mode):
self.name=name
self.mode=mode
def __enter__(self):
self.opened=open(self.name,self.mode)
return self.opened
def __exit__(self,exc_type,exc_val,exc_tb):
self.opened.close()
with open('mytext.txt','w') as write:
write.write('hello qaweqwe world')

```

#### 50.Django的請求生命周期

1,當用戶在瀏覽器中輸入url時瀏覽器會生成請求頭和請求體發送給服務端請求頭和請求體中會包含瀏覽器的動作(action)這個動作通常為get或者post提現在url之中
2.url經過Django中的wsgi再經過django的中間件,最后url到路由的映射表一條一條進行匹配一旦其中的某一條匹配成功就執行視圖函式,后面的路由就不在繼續匹配了
3視圖函式根據客戶端的請求查詢相應的資料,回傳給Django,然后Django把客戶端想要的資料作為一個字串回傳給客戶端
4客戶端瀏覽器接受到回傳的資料,經過渲染后顯示給用戶

#### 51.django rest framework規范

1url后盡量用名詞,因為rest frame是面向資源的編程,因此url命名時能體現出資源
2method的不同,實作增刪改查的操作
3版本號,因為有版本的更替,為了體現出版本的過度,因此在發請求的時候,要體現出版本號
4回傳值,與以往只回傳json不同,rest api規范要加上狀態碼,
5域名,由于前后端分離,因此要處理跨域問題,解決方法:jsonp,cors
6過濾,通過url傳參的形式傳遞搜索條件(列如:指定回傳的記錄數量,指定分頁等)

#### 52.jsonp和cors

jsonp的本質就是利用script的src屬性繞過同源策略
cors
整個cors通信程序,都是瀏覽器自動完成,不需要用戶參與,對于開發者來說cors通信和同源的ajax沒有什么區別,挨代碼完全一樣,瀏覽器一旦發現ajax請求跨源,就會自動添加一些附加頭的資訊,有時還會多出一次附加的請求,但用戶不會有感覺.

#### 53.現有字典dic = {'a':1,'b':2,'c':23,'d':11,'e':4,'f':21},請按照欄位中的value進行排序

```
print(sorted(dic.items(),key=lambda dic:dic[1]))

```

#### 54.mysql 搜索引擎和局域網權限,mysql中的鎖

innodb存盤引擎(最常用的引擎,支持事物,特點是行鎖,特點是行鎖設計,支持外鍵)
myisam存盤引擎(不支持事物,表鎖的設計,支持全文索引)
nod存盤引擎
memory存盤引擎

#### 55.二叉樹的遍歷

```
class BiTreeNode(object):
def __init__(self,data):
self.data = https://www.cnblogs.com/cnsd123/p/data
self.lchild = None
self.rchild = None
a = BiTreeNode('A')
b= BiTreeNode('B')
c = BiTreeNode('C')
d = BiTreeNode('D')
e = BiTreeNode('E')
f = BiTreeNode('F')
g = BiTreeNode('G')

e.lchild = a
e.rchild = g
a.rchild = c
c.lchild = b
c.rchild = d
g.rchild = f

root = e

# 前序遍歷 (先找做子樹,后找右子樹)

def pre_order(root):
if root:
print(root.data,end='') # EACBDGF
pre_order(root.lchild)
pre_order(root.rchild)
pre_order(root)

print('')

# 中序遍歷
def in_order(root):
if root:
in_order(root.lchild)
print(root.data,end='') # ABCDEGF
in_order(root.rchild)
in_order(root) # ABCDEGF

print('')

# 后序遍歷
def post_order(root):
if root:
post_order(root.lchild)
post_order(root.rchild)
print(root.data,end='')
post_order(root) #BDCAFGE

```

#### 56.實作頁面重繪的方法:

1輪訓
2長輪訓
3websocket

###### 輪訓:客戶端定向向服務器發送ajax請求,服務器接到請求后馬上回傳回應資訊并關閉連接.

優點:后端程式撰寫比較容易
缺點:請求中有大半是無用浪費帶寬和服務器資源.
實體:適用小型應用

###### 長輪訓:客戶端向服務器發送ajax請求,服務器連接到hold住連接,直到有新訊息才回傳回應資訊并關閉連接,客戶端處理完回應后再向服務端發送新的請求.

優點:在無訊息的情況下不會頻繁的請求
缺點:服務器hold連接會消耗資源,
實體:webqq,hi網頁版,facebook im,

#### 57.字典推導式

```
d = {key: value for (key, value) in iterable}

```

#### 58.python中單下劃線和雙下劃線

```
>>> class MyClass():
... def __init__(self):
... self.__superprivate = "Hello"
... self._semiprivate = ", world!"
...
>>> mc = MyClass()
>>> print mc.__superprivate
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: myClass instance has no attribute '__superprivate'
>>> print mc._semiprivate
, world!
>>> print mc.__dict__
{'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}

```

**foo**:一種約定,Python內部的名字,用來區別其他用戶自定義的命名,以防沖突,就是例如**init**(),**del**(),**call**()這些特殊方法
_foo:一種約定,用來指定變數私有.程式員用來指定私有變數的一種方式.不能用from module import * 匯入,其他方面和公有一樣訪問;
__foo:這個有真正的意義:決議器用*classname__foo來代替這個名字,以區別和其他類相同的命名,它無法直接像公有成員一樣隨便訪問,通過物件名.*類名__xxx這樣的方式可以訪問.
詳情見:[http://www.zhihu.com/question/19754941](https://link.jianshu.com?t=http%3A%2F%2Fwww.zhihu.com%2Fquestion%2F19754941)

#### 59.python多載

函式多載主要是為了解決兩個問題,
1.可變引數型別,
2.可變引數個數,
另外,一個基本的設計原則是,僅僅當兩個函式除了引數型別和引數個數不同以外,其功能是完全相同的,此時才使用函式多載,如果兩個函式的功能其實不同,那么不應當使用多載,而應當使用一個名字不同的函式,
好吧,那么對于情況 1 ,函式功能相同,但是引數型別不同,python 如何處理?答案是根本不需要處理,因為 python 可以接受任何型別的引數,如果函式的功能相同,那么不同的引數型別在 python 中很可能是相同的代碼,沒有必要做成兩個不同函式,
那么對于情況 2 ,函式功能相同,但引數個數不同,python 如何處理?大家知道,答案就是預設引數,對那些缺少的引數設定為預設引數即可解決問題,因為你假設函式功能相同,那么那些缺少的引數終歸是需要用的,
好了,鑒于情況 1 跟 情況 2 都有了解決方案,python 自然就不需要函式多載了,
引自知乎:[http://www.zhihu.com/question/20053359](https://link.jianshu.com?t=http%3A%2F%2Fwww.zhihu.com%2Fquestion%2F20053359)

#### 60.虛擬記憶體技術

虛擬存盤器是指具有請求和調入功能,能從邏輯上對記憶體容量加以擴充的一種存盤系統

#### 61.分頁和分段

分頁: 用戶程式的地址空間被劃分成若干固定大小的區域,稱為“頁”,相應地,記憶體空間分成若干個物理塊,頁和塊的大小相等,可將用戶程式的任一頁放在記憶體的任一塊中,實作了離散分配,
分段: 將用戶程式地址空間分成若干個大小不等的段,每段可以定義一組相對完整的邏輯資訊,存盤分配時,以段為單位,段與段在記憶體中可以不相鄰接,也實作了離散分配,

###### 分頁與分段的主要區別

1.頁是資訊的物理單位,分頁是為了實作非連續分配,以便解決記憶體碎片問題,或者說分頁是由于系統管理的需要.段是資訊的邏輯單位,它含有一組意義相對完整的資訊,分段的目的是為了更好地實作共享,滿足用戶的需要.
2.頁的大小固定,由系統確定,將邏輯地址劃分為頁號和頁內地址是由機器硬體實作的.而段的長度卻不固定,決定于用戶所撰寫的程式,通常由編譯程式在對源程式進行編譯時根據資訊的性質來劃分.
3.分頁的作業地址空間是一維的.分段的地址空間是二維的.

#### 62.去除串列中重復的元素

用集合

```
list(set(l))

```

用字典

```
l1 = ['b','c','d','b','c','a','a']
l2 = {}.fromkeys(l1).keys()
print l2

```

用字典并保持順序

```
l1 = ['b','c','d','b','c','a','a']
l2 = list(set(l1))
l2.sort(key=l1.index)
print l2

```

串列推導式

```
l1 = ['b','c','d','b','c','a','a']
l2 = []
[l2.append(i) for i in l1 if not i in l2]

```

sorted排序并且用串列推導式

```
l = ['b','c','d','b','c','a','a'] [single.append(i) for i in sorted(l) if i not in single] print single

```

#### 63.鏈表對調換

1->2->3->4轉換成2->1->4->3.

```
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
# @param a ListNode
# @return a ListNode
def swapPairs(self, head):
if head != None and head.next != None:
next = head.next
head.next = self.swapPairs(next.next)
next.next = head
return next
return head

```

#### 65.創建字典方法

1直接創建

```
dict = {'name':'earth', 'port':'80'}

```

2工廠方法

```
items=[('name','earth'),('port','80')]
dict2=dict(items)
dict1=dict((['name','earth'],['port','80']))

```

3frokeys()方法

```
dict1={}.fromkeys(('x','y'),-1)
dict={'x':-1,'y':-1}
dict2={}.fromkeys(('x','y'))
dict2={'x':None, 'y':None}

```

#### 66.二分查找

```
#coding:utf-8
def binary_search(list,item):
low = 0
high = len(list)-1
while low<=high:
mid = (low+high)/2
guess = list[mid]
if guess>item:
high = mid-1
elif guess<item:
low = mid+1
else:
return mid
return None
mylist = [1,3,5,7,9]
print binary_search(mylist,3)

```

#### 67.列舉你所知道的python代碼檢測工具以及它們之間的區別

```
pychecker是一個python代碼靜態分析工具,它可以幫助python代碼找bug會對代碼的復雜度提出警告
pulint高階的python代碼分析工具,分析python代碼中的錯誤查找不符合代碼風格標準

```

#### 68.如何用python來進行查找替換一個文本字串

find()方法可以在一個較長的字串中查找子字串,回傳子串坐在位置的最左端索引
replace()方法回傳某字串的所有匹配項均被替換之后得到的字串

#### 69.一些經典的編程題:

轉自:[https://www.jianshu.com/p/177bb9c418ed](https://www.jianshu.com/p/177bb9c418ed)

#### 70.用Python字串“這是一個test字串”的中文字符個數,字符編碼為utf-8

```
import os
import re
s='這是一個test字串'
result=re.findall(r'[\u4e00-\u9fa5]',s)
print(len(result)

```

#### 71.什么是python或者說python的特點

python是一門解釋性語言,運行之前不需要編譯,動態型別語言在宣告變數的時候不用宣告變數的型別面向物件編程,撰寫快,用途廣泛,能讓困難的事變得容易.

#### 72.補充缺失的代碼

def print_directory_contents(sPath):
““””
這個函式接受檔案夾的名稱作為輸入引數,
回傳該檔案夾中檔案的路徑,
以及其包含檔案夾中檔案的路徑,
"""

```
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

```

#### 73.下面這些是什意思@classmethod,@staticmethod,@property?

裝飾器,裝飾器是一種特殊的函式,要么接受函式作為輸入引數,并回傳一個函式,要么接受一個類為輸入引數,并回傳一個類
@標記是語法糖,可以讓你簡單易讀的方式裝飾目標物件,
詳細三種裝飾器:[Sheena@codementor](https://link.jianshu.com?t=https%3A%2F%2Fwww.codementor.io%2Fpython%2Ftutorial%2Fessential-python-interview-questions)

#### 74.介紹一下except的用法和作用

try....except執行try下的陳述句,如果發生例外,則執行程序跳到except陳述句,對每個except分支順序嘗試執行,如果例外與except中的例外組匹配,指行相應的陳述句.

#### 75.python中的pass陳述句作用是什么

占位符

#### 76.python中的unittest是什么

在python中,unittest是python中的單元測驗框架,它有支持共享搭建,自動測驗,在測驗中暫停代碼,將不同測驗迭代成一組.

#### 77.python中的模塊和包

在python中,模塊是搭建程式的一種方式,每個python代碼檔案都是一個模塊,并且可以參考其他的模塊,比如物件和屬性,
一個包包含許多python代碼的檔案夾是一個包,一個可以包含模塊和子檔案夾

#### 78.如何例外撲捉,常見的例外捕捉有哪些?

74題是一種方式
assert陳述句:判斷assert后面緊跟陳述句是True,還是False,如果是True則繼續執行print如果是false則中斷程式,呼叫默認的例外處理器,同時輸出assert陳述句逗號的提示資訊.
with陳述句:如果with陳述句或陳述句塊中發生例外,會呼叫默認的例外處理器處理但檔案還是會正常關閉,

#### 79.用python匹配html tag的時候,<.*>和<.*?>有什么區別?

前者是貪婪匹配,會從頭匹配到尾
而后者是非貪婪匹配,只匹配到第一個

#### 80.簡述標準庫中functools.wraps的作用

將原函式的物件指定屬性復制給包裝函式物件,默認有module,name,doc

#### 81.部署python開發的web程式的方法

* mod_python,這是一個apache內置模塊,很嚴重的依賴于mod_python編譯使用的python版本,和apache配套使用,不推薦
* fastcgi,這是目前流行最廣的做法,通過flup模塊來支持的在nginx里面對應的配置指令是fastcgi_pass
* scgi是cgi的替代版本scgi和fastcgi差不多nginx對應的配置指令是scgi_pass

#### 82.Django的model有哪幾種繼承形式,有何不同?

Django中有三種繼承方式

* 通常,你只想用父model來保存那些你不想在子model中重復錄入的資訊,父類是不使用的也就是不生成單獨的資料表,這種情況下使用抽象基類繼承 Abstract base classes
* 如果你想從現有的model繼承并并讓每個model都有自己的資料表,那么使用多重表繼承MUlti-table inheritance.
* 最后,如果你只想在model中修改python-level級的行為,而不涉及改變欄位改變,代理model (proxy models)適用各種場合.

#### 83.如何提高網頁的回應速度?

* 減少http的請求
* 使用cdn(cdn內容發布網路)是一組分布在不同地理位置的web服務器 ,cdn可能選擇網路階躍數最小的服務器,或者具有最短時間的服務器.
* 添加Expires頭(頁面初次訪問會進行很多的http請求,但是通過使用一個長久的expires頭,可以使這些組件被快取,下次訪問的時候就可以減少不必要的http請求,從而提高加載速度
* 壓縮組件從http1.1開始web服務端可以通過http請求中的accept-Encoding頭表示對壓縮的支持
* 將腳本放在底部
* 避免css運算式(css運算式是動態設定css屬性的一種強大并且)

#### 84.統計一篇英文文章內每個單詞出現頻率,并回傳出現頻率最高的前10個單詞及其出現次數,

```
from collections import Counter
import re

with open('a.txt', 'r', encoding='utf-8') as f:
txt = f.read()
c = Counter(re.split('\W+',txt)) #取出每個單詞出現的個數
print(c)
ret = c.most_common(10) #取出頻率最高的前10個
print(ret)

```

#### 85.給你一個數,如何找到最大值

max(list)
說明max實作原理?

```
max(iterable, *[, default=obj, key=func]) -> value
max(arg1, arg2, *args, *[, key=func]) -> value

With a single iterable argument, return its biggest item. The
default keyword-only argument specifies an object to return if
the provided iterable is empty.
With two or more arguments, return the largest argument.

```

#### 86.寫出這段代碼的輸出結果

```
num=9
def f1():
num=20
def f2():
print(num)
f2()
f1()
f2()

```

結果:
9
9

#### 常見的報錯問題

```
AttributeError 試圖訪問一個物件沒有的樹形,比如foo.x,但是foo沒有屬性x
IOError 輸入/輸出例外;基本上是無法打開檔案
ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤
IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]
KeyError 試圖訪問字典里不存在的鍵
KeyboardInterrupt Ctrl+C被按下
NameError 使用一個還未被賦予物件的變數
SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)
TypeError 傳入物件型別與要求的不符合
UnboundLocalError 試圖訪問一個還未被設定的區域變數,基本上是由于另有一個同名的全域變數,
導致你以為正在訪問它
ValueError 傳入一個呼叫者不期望的值,即使值的型別是正確的`

```

![image](//upload-images.jianshu.io/upload_images/8562039-d4b9bff5d9cd4ab9.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/400/format/webp)

 

推薦一下我建的python學習交流扣扣qun:850973621,群里有免費的視頻教程,開發工具、
電子書籍、專案原始碼分享,一起交流學習,一起進步!
![在這里插入圖片描述](https://img-blog.csdnimg.cn/20201210132421297.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1VneWZ5dg==,size_16,color_FFFFFF,t_70)
![在這里插入圖片描述](https://img-blog.csdnimg.cn/20201210132421299.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1VneWZ5dg==,size_16,color_FFFFFF,t_70)

 

 

作者:_Caesar
鏈接:https://www.jianshu.com/p/c5b649eef774
來源:簡書
著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請注明出處,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/232877.html

標籤:Python

上一篇:神兵利器推薦——你一定不能錯過的mac alfred作業流

下一篇:Python爬蟲實戰演練:爬取微博大V的評論資料

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more