Python面试题大全(二):python高级语法
目錄
Python高級
元類
42.Python中類方法、類實例方法、靜態(tài)方法有何區(qū)別?
43.遍歷一個object的所有屬性,并print每一個屬性名?
44.寫一個類,并讓它盡可能多的支持操作符?
45.介紹Cython,Pypy Cpython Numba各有什么缺點
46.請描述抽象類和接口類的區(qū)別和聯(lián)系
47.Python中如何動態(tài)獲取和設(shè)置對象的屬性?
內(nèi)存管理與垃圾回收機(jī)制
48.哪些操作會導(dǎo)致Python內(nèi)存溢出,怎么處理?
49.關(guān)于Python內(nèi)存管理,下列說法錯誤的是 B
50.Python的內(nèi)存管理機(jī)制及調(diào)優(yōu)手段?
51.內(nèi)存泄露是什么?如何避免?
函數(shù)
52.python常見的列表推導(dǎo)式?
53.簡述read、readline、readlines的區(qū)別?
54.什么是Hash(散列函數(shù))?
55.python函數(shù)重載機(jī)制?
56.寫一個函數(shù)找出一個整數(shù)數(shù)組中,第二大的數(shù)
57.手寫一個判斷時間的裝飾器
58.使用Python內(nèi)置的filter()方法來過濾?
59.編寫函數(shù)的4個原則
60.函數(shù)調(diào)用參數(shù)的傳遞方式是值傳遞還是引用傳遞?
61.如何在function里面設(shè)置一個全局變量
62.對缺省參數(shù)的理解 ?
63.Mysql怎么限制IP訪問?
64.帶參數(shù)的裝飾器?
65.為什么函數(shù)名字可以當(dāng)做參數(shù)用?
66.Python中pass語句的作用是什么?
67.有這樣一段代碼,print c會輸出什么,為什么?
68.交換兩個變量的值?
69.map函數(shù)和reduce函數(shù)?
70.回調(diào)函數(shù),如何通信的?
71.Python主要的內(nèi)置數(shù)據(jù)類型都有哪些? print dir( ‘a(chǎn) ’) 的輸出?
72.map(lambda x:xx,[y for y in range(3)])的輸出?
73.hasattr() getattr() setattr() 函數(shù)使用詳解?
74.一句話解決階乘函數(shù)?
75.什么是lambda函數(shù)? 有什么好處?
76.遞歸函數(shù)停止的條件?
77.下面這段代碼的輸出結(jié)果將是什么?請解釋。
78.什么是lambda函數(shù)?它有什么好處?寫一個匿名函數(shù)求兩個數(shù)的和
設(shè)計模式
79.對設(shè)計模式的理解,簡述你了解的設(shè)計模式?
80.請手寫一個單例
81.單例模式的應(yīng)用場景有那些?
82.用一行代碼生成[1,4,9,16,25,36,49,64,81,100]
83.對裝飾器的理解,并寫出一個計時器記錄方法執(zhí)行性能的裝飾器?
84.解釋以下什么是閉包?
85.函數(shù)裝飾器有什么作用?
86.生成器,迭代器的區(qū)別?
87.X是什么類型?
88.請用一行代碼 實現(xiàn)將1-N 的整數(shù)列表以3為單位分組
89.Python中yield的用法?
面向?qū)ο?/p>
90.Python中的可變對象和不可變對象?
91.Python的魔法方法
92.面向?qū)ο笾性趺磳崿F(xiàn)只讀屬性?
93.談?wù)勀銓γ嫦驅(qū)ο蟮睦斫?#xff1f;
正則表達(dá)式
94.請寫出一段代碼用正則匹配出ip?
95.a = “abbbccc”,用正則匹配為abccc,不管有多少b,就出現(xiàn)一次?
96.Python字符串查找和替換?
97.用Python匹配HTML g tag的時候,<.> 和 <.*?> 有什么區(qū)別
98.正則表達(dá)式貪婪與非貪婪模式的區(qū)別?
99.寫出開頭匹配字母和下劃線,末尾是數(shù)字的正則表達(dá)式?
100.正則表達(dá)式操作
101.請匹配出變量A 中的json字符串。
102.怎么過濾評論中的表情?
103.簡述Python里面search和match的區(qū)別
104.請寫出匹配ip的Python正則表達(dá)式
105.Python里match與search的區(qū)別?
系統(tǒng)編程
106.進(jìn)程總結(jié)
107.談?wù)勀銓Χ噙M(jìn)程,多線程,以及協(xié)程的理解,項目是否用?
108.Python異常使用場景有那些?
109.多線程共同操作同一個數(shù)據(jù)互斥鎖同步?
110.什么是多線程競爭?
111.請介紹一下Python的線程同步?
112.解釋以下什么是鎖,有哪幾種鎖?
113.什么是死鎖?
114.多線程交互訪問數(shù)據(jù),如果訪問到了就不訪問了?
115.什么是線程安全,什么是互斥鎖?
116.說說下面幾個概念:同步,異步,阻塞,非阻塞?
117.什么是僵尸進(jìn)程和孤兒進(jìn)程?怎么避免僵尸進(jìn)程?
118.python中進(jìn)程與線程的使用場景?
119.線程是并發(fā)還是并行,進(jìn)程是并發(fā)還是并行?
120.并行(parallel)和并發(fā)(concurrency)?
121.IO密集型和CPU密集型區(qū)別?
122.python asyncio的原理?
網(wǎng)絡(luò)編程
123.怎么實現(xiàn)強(qiáng)行關(guān)閉客戶端和服務(wù)器之間的連接?
124.簡述TCP和UDP的區(qū)別以及優(yōu)缺點?
125.簡述瀏覽器通過WSGI請求動態(tài)資源的過程?
126.描述用瀏覽器訪問www.baidu.com的過程
127.Post和Get請求的區(qū)別?
129.列出你知道的HTTP協(xié)議的狀態(tài)碼,說出表示什么意思?
130.請簡單說一下三次握手和四次揮手?
131.說一下什么是tcp的2MSL?
132.為什么客戶端在TIME-WAIT狀態(tài)必須等待2MSL的時間?
133.說說HTTP和HTTPS區(qū)別?
134.談一下HTTP協(xié)議以及協(xié)議頭部中表示數(shù)據(jù)類型的字段?
135.HTTP請求方法都有什么?
136.使用Socket套接字需要傳入哪些參數(shù) ?
137.HTTP常見請求頭?
138.七層模型?
139.url的形式?
Python高級
元類
42.Python中類方法、類實例方法、靜態(tài)方法有何區(qū)別?
類方法: 是類對象的方法,在定義時需要在上方使用 @classmethod 進(jìn)行裝飾,形參為cls,表示類對象,類對象和實例對象都可調(diào)用
類實例方法: 是類實例化對象的方法,只有實例對象可以調(diào)用,形參為self,指代對象本身;
靜態(tài)方法: 是一個任意函數(shù),在其上方使用 @staticmethod 進(jìn)行裝飾,可以用對象直接調(diào)用,靜態(tài)方法實際上跟該類沒有太大關(guān)系
43.遍歷一個object的所有屬性,并print每一個屬性名?
class Car:def __init__(self,name,loss): # loss [價格,油耗,公里數(shù)]self.name = nameself.loss = lossdef getName(self):return self.namedef getPrice(self):# 獲取汽車價格return self.loss[0]def getLoss(self):# 獲取汽車損耗值return self.loss[1] * self.loss[2]Bmw = Car("寶馬",[60,9,500]) # 實例化一個寶馬車對象 print(getattr(Bmw,"name")) # 使用getattr()傳入對象名字,屬性值。 print(dir(Bmw)) # 獲Bmw所有的屬性和方法44.寫一個類,并讓它盡可能多的支持操作符?
class Array:__list = []def __init__(self):print "constructor"def __del__(self):print "destruct"def __str__(self):return "this self-defined array class"def __getitem__(self,key):return self.__list[key]def __len__(self):return len(self.__list)def Add(self,value):self.__list.append(value)def Remove(self,index):del self.__list[index]def DisplayItems(self):print "show all items---"for item in self.__list:print item45.介紹Cython,Pypy Cpython Numba各有什么缺點
Cython
46.請描述抽象類和接口類的區(qū)別和聯(lián)系
1.抽象類: 規(guī)定了一系列的方法,并規(guī)定了必須由繼承類實現(xiàn)的方法。由于有抽象方法的存在,所以抽象類不能實例化。可以將抽象類理解為毛坯房,門窗,墻面的樣式由你自己來定,所以抽象類與作為基類的普通類的區(qū)別在于約束性更強(qiáng)
2.接口類:與抽象類很相似,表現(xiàn)在接口中定義的方法,必須由引用類實現(xiàn),但他與抽象類的根本區(qū)別在于用途:與不同個體間溝通的規(guī)則,你要進(jìn)宿舍需要有鑰匙,這個鑰匙就是你與宿舍的接口,你的舍友也有這個接口,所以他也能進(jìn)入宿舍,你用手機(jī)通話,那么手機(jī)就是你與他人交流的接口
3.區(qū)別和關(guān)聯(lián):
1.接口是抽象類的變體,接口中所有的方法都是抽象的,而抽象類中可以有非抽象方法,抽象類是聲明方法的存在而不去實現(xiàn)它的類
2.接口可以繼承,抽象類不行
3.接口定義方法,沒有實現(xiàn)的代碼,而抽象類可以實現(xiàn)部分方法
4.接口中基本數(shù)據(jù)類型為static而抽象類不是
47.Python中如何動態(tài)獲取和設(shè)置對象的屬性?
if hasattr(Parent, 'x'):print(getattr(Parent, 'x'))setattr(Parent, 'x',3) print(getattr(Parent,'x'))內(nèi)存管理與垃圾回收機(jī)制
48.哪些操作會導(dǎo)致Python內(nèi)存溢出,怎么處理?
49.關(guān)于Python內(nèi)存管理,下列說法錯誤的是 B
A,變量不必事先聲明 B,變量無須先創(chuàng)建和賦值而直接使用
C,變量無須指定類型 D,可以使用del釋放資源
50.Python的內(nèi)存管理機(jī)制及調(diào)優(yōu)手段?
內(nèi)存管理機(jī)制: 引用計數(shù)、垃圾回收、內(nèi)存池
引用計數(shù):引用計數(shù)是一種非常高效的內(nèi)存管理手段,當(dāng)一個Python對象被引用時其引用計數(shù)增加1,
當(dāng)其不再被一個變量引用時則計數(shù)減1,當(dāng)引用計數(shù)等于0時對象被刪除。弱引用不會增加引用計數(shù)
垃圾回收:
1.引用計數(shù)
引用計數(shù)也是一種垃圾收集機(jī)制,而且也是一種最直觀、最簡單的垃圾收集技術(shù)。當(dāng)Python的某個對象的引用計數(shù)降為0時,說明沒有任何引用指向該對象,該對象就成為要被回收的垃圾了。比如某個新建對象,它被分配給某個引用,對象的引用計數(shù)變?yōu)?,如果引用被刪除,對象的引用計數(shù)為0,那么該對象就可以被垃圾回收。不過如果出現(xiàn)循環(huán)引用的話,引用計數(shù)機(jī)制就不再起有效的作用了。
2.標(biāo)記清除
https://foofish.net/python-gc.html
調(diào)優(yōu)手段
1.手動垃圾回收
2.調(diào)高垃圾回收閾值
3.避免循環(huán)引用
51.內(nèi)存泄露是什么?如何避免?
內(nèi)存泄漏指由于疏忽或錯誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計錯誤,導(dǎo)致在釋放該段內(nèi)存之前就失去了對該段內(nèi)存的控制,從而造成了內(nèi)存的浪費。
有__del__()函數(shù)的對象間的循環(huán)引用是導(dǎo)致內(nèi)存泄露的主兇。不使用一個對象時使用: del object 來刪除一個對象的引用計數(shù)就可以有效防止內(nèi)存泄露問題。
通過Python擴(kuò)展模塊gc 來查看不能回收的對象的詳細(xì)信息。
可以通過 sys.getrefcount(obj) 來獲取對象的引用計數(shù),并根據(jù)返回值是否為0來判斷是否內(nèi)存泄露
函數(shù)
52.python常見的列表推導(dǎo)式?
[表達(dá)式 for 變量 in 列表] 或者 [表達(dá)式 for 變量 in 列表 if 條件]
53.簡述read、readline、readlines的區(qū)別?
read 讀取整個文件
readline 讀取下一行
readlines 讀取整個文件到一個迭代器以供我們遍歷
54.什么是Hash(散列函數(shù))?
散列函數(shù)(英語:Hash function)又稱散列算法、哈希函數(shù),是一種從任何一種數(shù)據(jù)中創(chuàng)建小的數(shù)字“指紋”的方法。散列函數(shù)把消息或數(shù)據(jù)壓縮成摘要,使得數(shù)據(jù)量變小,將數(shù)據(jù)的格式固定下來。該函數(shù)將數(shù)據(jù)打亂混合,重新創(chuàng)建一個叫做散列值(hash values,hash codes,hash sums,或hashes)的指紋。散列值通常用一個短的隨機(jī)字母和數(shù)字組成的字符串來代表
55.python函數(shù)重載機(jī)制?
函數(shù)重載主要是為了解決兩個問題。 1。可變參數(shù)類型。 2。可變參數(shù)個數(shù)。
另外,一個基本的設(shè)計原則是,僅僅當(dāng)兩個函數(shù)除了參數(shù)類型和參數(shù)個數(shù)不同以外,其功能是完全相同的,此時才使用函數(shù)重載,如果兩個函數(shù)的功能其實不同,那么不應(yīng)當(dāng)使用重載,而應(yīng)當(dāng)使用一個名字不同的函數(shù)。
好吧,那么對于情況 1 ,函數(shù)功能相同,但是參數(shù)類型不同,python 如何處理?答案是根本不需要處理,因為 python 可以接受任何類型的參數(shù),如果函數(shù)的功能相同,那么不同的參數(shù)類型在 python 中很可能是相同的代碼,沒有必要做成兩個不同函數(shù)。
那么對于情況 2 ,函數(shù)功能相同,但參數(shù)個數(shù)不同,python 如何處理?大家知道,答案就是缺省參數(shù)。對那些缺少的參數(shù)設(shè)定為缺省參數(shù)即可解決問題。因為你假設(shè)函數(shù)功能相同,那么那些缺少的參數(shù)終歸是需要用的。
好了,鑒于情況 1 跟 情況 2 都有了解決方案,python 自然就不需要函數(shù)重載了。
56.寫一個函數(shù)找出一個整數(shù)數(shù)組中,第二大的數(shù)
57.手寫一個判斷時間的裝飾器
import datetimeclass TimeException(Exception):def __init__(self, exception_info):super().__init__()self.info = exception_infodef __str__(self):return self.infodef timecheck(func):def wrapper(*args, **kwargs):if datetime.datetime.now().year == 2019:func(*args, **kwargs)else:raise TimeException("函數(shù)已過時")return wrapper@timecheck def test(name):print("Hello {}, 2019 Happy".format(name))if __name__ == "__main__":test("backbp")58.使用Python內(nèi)置的filter()方法來過濾?
list(filter(lambda x: x % 2 == 0, range(10)))59.編寫函數(shù)的4個原則
1.函數(shù)設(shè)計要盡量短小
2.函數(shù)聲明要做到合理、簡單、易于使用
3.函數(shù)參數(shù)設(shè)計應(yīng)該考慮向下兼容
4.一個函數(shù)只做一件事情,盡量保證函數(shù)語句粒度的一致性
60.函數(shù)調(diào)用參數(shù)的傳遞方式是值傳遞還是引用傳遞?
Python的參數(shù)傳遞有:位置參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)。
函數(shù)的傳值到底是值傳遞還是引用傳遞、要分情況:
不可變參數(shù)用值傳遞:像整數(shù)和字符串這樣的不可變對象,是通過拷貝進(jìn)行傳遞的,因為你無論如何都不可能在原處改變不可變對象。
可變參數(shù)是引用傳遞:比如像列表,字典這樣的對象是通過引用傳遞、和C語言里面的用指針傳遞數(shù)組很相似,可變對象能在函數(shù)內(nèi)部改變。
61.如何在function里面設(shè)置一個全局變量
globals() # 返回包含當(dāng)前作用余全局變量的字典。 global 變量 設(shè)置使用全局變量62.對缺省參數(shù)的理解 ?
缺省參數(shù)指在調(diào)用函數(shù)的時候沒有傳入?yún)?shù)的情況下,調(diào)用默認(rèn)的參數(shù),在調(diào)用函數(shù)的同時賦值時,所傳入的參數(shù)會替代默認(rèn)參數(shù)。
*args是不定長參數(shù),它可以表示輸入?yún)?shù)是不確定的,可以是任意多個。
**kwargs是關(guān)鍵字參數(shù),賦值的時候是以鍵值對的方式,參數(shù)可以是任意多對在定義函數(shù)的時候
不確定會有多少參數(shù)會傳入時,就可以使用兩個參數(shù)
63.Mysql怎么限制IP訪問?
64.帶參數(shù)的裝飾器?
帶定長參數(shù)的裝飾器
def new_func(func):def wrappedfun(username, passwd):if username == 'root' and passwd == '123456789':print('通過認(rèn)證')print('開始執(zhí)行附加功能')return func()else:print('用戶名或密碼錯誤')returnreturn wrappedfun@new_func def origin():print('開始執(zhí)行函數(shù)') origin('root','123456789')帶不定長參數(shù)的裝飾器
def new_func(func):def wrappedfun(*parts):if parts:counts = len(parts)print('本系統(tǒng)包含 ', end='')for part in parts:print(part, ' ',end='')print('等', counts, '部分')return func()else:print('用戶名或密碼錯誤')return func()return wrappedfun65.為什么函數(shù)名字可以當(dāng)做參數(shù)用?
Python中一切皆對象,函數(shù)名是函數(shù)在內(nèi)存中的空間,也是一個對象
66.Python中pass語句的作用是什么?
在編寫代碼時只寫框架思路,具體實現(xiàn)還未編寫就可以用pass進(jìn)行占位,是程序不報錯,不會進(jìn)行任何操作。
67.有這樣一段代碼,print c會輸出什么,為什么?
a = 10 b = 20 c = [a] a = 15答:10對于字符串,數(shù)字,傳遞是相應(yīng)的值
68.交換兩個變量的值?
a, b = b, a69.map函數(shù)和reduce函數(shù)?
map(lambda x: x * x, [1, 2, 3, 4]) # 使用 lambda # [1, 4, 9, 16] reduce(lambda x, y: x * y, [1, 2, 3, 4]) # 相當(dāng)于 ((1 * 2) * 3) * 4 # 2470.回調(diào)函數(shù),如何通信的?
回調(diào)函數(shù)是把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),將整個函數(shù)當(dāng)作一個對象,賦值給調(diào)用的函數(shù)。
71.Python主要的內(nèi)置數(shù)據(jù)類型都有哪些? print dir( ‘a(chǎn) ’) 的輸出?
內(nèi)建類型:布爾類型,數(shù)字,字符串,列表,元組,字典,集合
輸出字符串'a'的內(nèi)建方法
72.map(lambda x:xx,[y for y in range(3)])的輸出?
[0, 1, 4]73.hasattr() getattr() setattr() 函數(shù)使用詳解?
hasattr(object,name)函數(shù):
判斷一個對象里面是否有name屬性或者name方法,返回bool值,有name屬性(方法)返回True,否則返回False。
class function_demo(object):name = 'demo'def run(self):return "hello function" functiondemo = function_demo() res = hasattr(functiondemo, "name") # 判斷對象是否有name屬性,True res = hasattr(functiondemo, "run") # 判斷對象是否有run方法,True res = hasattr(functiondemo, "age") # 判斷對象是否有age屬性,False print(res)getattr(object, name[,default])函數(shù):
獲取對象object的屬性或者方法,如果存在則打印出來,如果不存在,打印默認(rèn)值,默認(rèn)值可選。注意:如果返回的是對象的方法,則打印結(jié)果是:方法的內(nèi)存地址,如果需要運行這個方法,可以在后面添加括號().
functiondemo = function_demo() getattr(functiondemo, "name")# 獲取name屬性,存在就打印出來 --- demo getattr(functiondemo, "run") # 獲取run 方法,存在打印出方法的內(nèi)存地址 getattr(functiondemo, "age") # 獲取不存在的屬性,報錯 getattr(functiondemo, "age", 18)# 獲取不存在的屬性,返回一個默認(rèn)值setattr(object, name, values)函數(shù):
給對象的屬性賦值,若屬性不存在,先創(chuàng)建再賦值
class function_demo(object):name = "demo"def run(self):return "hello function" functiondemo = function_demo() res = hasattr(functiondemo, "age") # 判斷age屬性是否存在,False print(res) setattr(functiondemo, "age", 18) # 對age屬性進(jìn)行賦值,無返回值 res1 = hasattr(functiondemo, "age") # 再次判斷屬性是否存在,True綜合使用
class function_demo(object):name = "demo"def run(self):return "hello function" functiondemo = function_demo() res = hasattr(functiondemo, "addr") # 先判斷是否存在 if res:addr = getattr(functiondemo, "addr")print(addr) else:addr = getattr(functiondemo, "addr", setattr(functiondemo, "addr", "北京首都"))print(addr)74.一句話解決階乘函數(shù)?
reduce(lambda x,y : x*y,range(1,n+1))75.什么是lambda函數(shù)? 有什么好處?
lambda 函數(shù)是一個可以接收任意多個參數(shù)(包括可選參數(shù))并且返回單個表達(dá)式值的函數(shù)
1.lambda函數(shù)比較輕便,即用即仍,很適合需要完成一項功能,但是此功能只在此一處使用,連名字都很隨意的情況下
2.匿名函數(shù),一般用來給filter,map這樣的函數(shù)式編程服務(wù)
3.作為回調(diào)函數(shù),傳遞給某些應(yīng)用,比如消息處理
76.遞歸函數(shù)停止的條件?
遞歸的終止條件一般定義在遞歸函數(shù)內(nèi)部,在遞歸調(diào)用前要做一個條件判斷,根據(jù)判斷的結(jié)果選擇是繼續(xù)調(diào)用自身,還是return,,返回終止遞歸。
終止的條件:判斷遞歸的次數(shù)是否達(dá)到某一限定值
2.判斷運算的結(jié)果是否達(dá)到某個范圍等,根據(jù)設(shè)計的目的來選擇
77.下面這段代碼的輸出結(jié)果將是什么?請解釋。
def multipliers():return [lambda x: i *x for i in range(4)]print([m(2) for m in multipliers()])上面代碼的輸出結(jié)果是[6,6,6,6],不是我們想的[0,2,4,6]
你如何修改上面的multipliers的定義產(chǎn)生想要的結(jié)果?
上述問題產(chǎn)生的原因是python閉包的延遲綁定。這意味著內(nèi)部函數(shù)被調(diào)用時,參數(shù)的值在閉包內(nèi)進(jìn)行查找。因此,當(dāng)任何由multipliers()返回的函數(shù)被調(diào)用時,i的值將在附近的范圍進(jìn)行查找。那時,不管返回的函數(shù)是否被調(diào)用,for循環(huán)已經(jīng)完成,i被賦予了最終的值3.
def multipliers():for i in range(4):yield lambda x: i *x def multipliers():return [lambda x,i = i: i*x for i in range(4)]78.什么是lambda函數(shù)?它有什么好處?寫一個匿名函數(shù)求兩個數(shù)的和
lambda函數(shù)是匿名函數(shù),使用lambda函數(shù)能創(chuàng)建小型匿名函數(shù),這種函數(shù)得名于省略了用def聲明函數(shù)的標(biāo)準(zhǔn)步驟
設(shè)計模式
79.對設(shè)計模式的理解,簡述你了解的設(shè)計模式?
設(shè)計模式是經(jīng)過總結(jié),優(yōu)化的,對我們經(jīng)常會碰到的一些編程問題的可重用解決方案。一個設(shè)計模式并不像一個類或一個庫那樣能夠直接作用于我們的代碼,反之,設(shè)計模式更為高級,它是一種必須在特定情形下實現(xiàn)的一種方法模板。 常見的是工廠模式和單例模式
80.請手寫一個單例
#python2 class A(object):__instance = Nonedef __new__(cls,*args,**kwargs):if cls.__instance is None:cls.__instance = objecet.__new__(cls)return cls.__instanceelse:return cls.__instance81.單例模式的應(yīng)用場景有那些?
單例模式應(yīng)用的場景一般發(fā)現(xiàn)在以下條件下: 資源共享的情況下,避免由于資源操作時導(dǎo)致的性能或損耗等,如日志文件,應(yīng)用配置。 控制資源的情況下,方便資源之間的互相通信。如線程池等,1,網(wǎng)站的計數(shù)器 2,應(yīng)用配置 3.多線程池 4數(shù)據(jù)庫配置 數(shù)據(jù)庫連接池 5.應(yīng)用程序的日志應(yīng)用...
82.用一行代碼生成[1,4,9,16,25,36,49,64,81,100]
print([x*x for x in range(1, 11)])83.對裝飾器的理解,并寫出一個計時器記錄方法執(zhí)行性能的裝飾器?
裝飾器本質(zhì)上是一個callable object ,它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數(shù)對象。
import time from functools import wrapsdef timeit(func):@wraps(func)def wrapper(*args, **kwargs):start = time.clock()ret = func(*args, **kwargs)end = time.clock()print('used:',end-start)return retreturn wrapper @timeit def foo():print('in foo()'foo())84.解釋以下什么是閉包?
在函數(shù)內(nèi)部再定義一個函數(shù),并且這個函數(shù)用到了外邊函數(shù)的變量,那么將這個函數(shù)以及用到的一些變量稱之為閉包。
85.函數(shù)裝飾器有什么作用?
裝飾器本質(zhì)上是一個callable object,它可以在讓其他函數(shù)在不需要做任何代碼的變動的前提下增加額外的功能。裝飾器的返回值也是一個函數(shù)的對象,它經(jīng)常用于有切面需求的場景。比如:插入日志,性能測試,事務(wù)處理,緩存。權(quán)限的校驗等場景,有了裝飾器就可以抽離出大量的與函數(shù)功能本身無關(guān)的雷同代碼并發(fā)并繼續(xù)使用。 詳細(xì)參考:https://manjusaka.itscoder.com/2018/02/23/something-about-decorator/
86.生成器,迭代器的區(qū)別?
迭代器是遵循迭代協(xié)議的對象。用戶可以使用 iter() 以從任何序列得到迭代器(如 list, tuple, dictionary, set 等)。另一個方法則是創(chuàng)建一個另一種形式的迭代器 —— generator 。要獲取下一個元素,則使用成員函數(shù) next()(Python 2)或函數(shù) next() function (Python 3) 。當(dāng)沒有元素時,則引發(fā) StopIteration 此例外。若要實現(xiàn)自己的迭代器,則只要實現(xiàn) next()(Python 2)或?__next__()( Python 3)
生成器(Generator),只是在需要返回數(shù)據(jù)的時候使用yield語句。每次next()被調(diào)用時,生成器會返回它脫離的位置(它記憶語句最后一次執(zhí)行的位置和所有的數(shù)據(jù)值)
區(qū)別: 生成器能做到迭代器能做的所有事,而且因為自動創(chuàng)建iter()和next()方法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器表達(dá)式取代列表解析可以同時節(jié)省內(nèi)存。除了創(chuàng)建和保存程序狀態(tài)的自動方法,當(dāng)發(fā)生器終結(jié)時,還會自動拋出StopIteration異常。
官方介紹:https://docs.python.org/3/tutorial/classes.html#iterators
87.X是什么類型?
X= (i for i in range(10)) X是 generator類型88.請用一行代碼 實現(xiàn)將1-N 的整數(shù)列表以3為單位分組
N =100 print ([[x for x in range(1,100)] [i:i+3] for i in range(0,100,3)])89.Python中yield的用法?
yield就是保存當(dāng)前程序執(zhí)行狀態(tài)。你用for循環(huán)的時候,每次取一個元素的時候就會計算一次。用yield的函數(shù)叫g(shù)enerator,和iterator一樣,它的好處是不用一次計算所有元素,而是用一次算一次,可以節(jié)省很多空間,generator每次計算需要上一次計算結(jié)果,所以用yield,否則一return,上次計算結(jié)果就沒了
面向?qū)ο?/h2>
90.Python中的可變對象和不可變對象?
不可變對象,該對象所指向的內(nèi)存中的值不能被改變。當(dāng)改變某個變量時候,由于其所指的值不能被改變,相當(dāng)于把原來的值復(fù)制一份后再改變,這會開辟一個新的地址,變量再指向這個新的地址。
可變對象,該對象所指向的內(nèi)存中的值可以被改變。變量(準(zhǔn)確的說是引用)改變后,實際上其所指的值直接發(fā)生改變,并沒有發(fā)生復(fù)制行為,也沒有開辟出新的地址,通俗點說就是原地改變。
Pyhton中,數(shù)值類型(int 和float),字符串str、元祖tuple都是不可變類型。而列表list、字典dict、集合set是可變類型
91.Python的魔法方法
魔法方法就是可以給你的類增加魔力的特殊方法,如果你的對象實現(xiàn)(重載)了這些方法中的某一個,那么這個方法就會在特殊的情況下被Python所調(diào)用,你可以定義自己想要的行為,而這一切都是自動發(fā)生的,它們經(jīng)常是兩個下劃線包圍來命名的(比如__init___,__len__),Python的魔法方法是非常強(qiáng)大的所以了解其使用方法也變得尤為重要!
__init__構(gòu)造器,當(dāng)一個實例被創(chuàng)建的時候初始化的方法,但是它并不是實例化調(diào)用的第一個方法。
__new__才是實例化對象調(diào)用的第一個方法,它只取下cls參數(shù),并把其他參數(shù)傳給__init___.
___new__很少使用,但是也有它適合的場景,尤其是當(dāng)類繼承自一個像元祖或者字符串這樣不經(jīng)常改變的類型的時候。
__call__讓一個類的實例像函數(shù)一樣被調(diào)用
__getitem__定義獲取容器中指定元素的行為,相當(dāng)于self[key]
__getattr__定義當(dāng)用戶試圖訪問一個不存在屬性的時候的行為。
__setattr__定義當(dāng)一個屬性被設(shè)置的時候的行為
__getattribute___定義當(dāng)一個屬性被訪問的時候的行為
92.面向?qū)ο笾性趺磳崿F(xiàn)只讀屬性?
將對象私有化,通過共有方法提供一個讀取數(shù)據(jù)的接口
class person:def __init__(self, x):self.__age = 10def age(self):return self.__age t = person(22) # t.__age =100 print(t.age())最好的方法
class MyCls(object):__weight = 50@propertydef weight(self):return self.__weight93.談?wù)勀銓γ嫦驅(qū)ο蟮睦斫?#xff1f;
面向?qū)ο笫窍喈?dāng)于面向過程而言的,面向過程語言是一種基于功能分析的,以算法為中心的程序設(shè)計方法,而面向?qū)ο笫且环N基于結(jié)構(gòu)分析的,以數(shù)據(jù)為中心的程序設(shè)計思想。在面向?qū)ο笳Z言中有一個很重要的東西,叫做類。面向?qū)ο笥腥筇匦?#xff1a;封裝、繼承、多態(tài)。
正則表達(dá)式
94.請寫出一段代碼用正則匹配出ip?
95.a = “abbbccc”,用正則匹配為abccc,不管有多少b,就出現(xiàn)一次?
96.Python字符串查找和替換?
97.用Python匹配HTML g tag的時候,<.> 和 <.*?> 有什么區(qū)別
98.正則表達(dá)式貪婪與非貪婪模式的區(qū)別?
99.寫出開頭匹配字母和下劃線,末尾是數(shù)字的正則表達(dá)式?
100.正則表達(dá)式操作
101.請匹配出變量A 中的json字符串。
102.怎么過濾評論中的表情?
103.簡述Python里面search和match的區(qū)別
104.請寫出匹配ip的Python正則表達(dá)式
105.Python里match與search的區(qū)別?
系統(tǒng)編程
106.進(jìn)程總結(jié)
進(jìn)程:程序運行在操作系統(tǒng)上的一個實例,就稱之為進(jìn)程。進(jìn)程需要相應(yīng)的系統(tǒng)資源:內(nèi)存、時間片、pid。 創(chuàng)建進(jìn)程: 首先要導(dǎo)入multiprocessing中的Process: 創(chuàng)建一個Process對象; 創(chuàng)建Process對象時,可以傳遞參數(shù);
p = Process(target=XXX,args=(tuple,),kwargs={key:value}) target = XXX 指定的任務(wù)函數(shù),不用加(), args=(tuple,)kwargs={key:value}給任務(wù)函數(shù)傳遞的參數(shù)使用start()啟動進(jìn)程 結(jié)束進(jìn)程 給子進(jìn)程指定函數(shù)傳遞參數(shù)Demo
import os from mulitprocessing import Process import timedef pro_func(name,age,**kwargs):for i in range(5):print("子進(jìn)程正在運行中,name=%s,age=%d,pid=%d"%(name,age,os.getpid()))print(kwargs)time.sleep(0.2) if __name__ =="__main__":#創(chuàng)建Process對象p = Process(target=pro_func,args=('小明',18),kwargs={'m':20})#啟動進(jìn)程p.start()time.sleep(1)#1秒鐘之后,立刻結(jié)束子進(jìn)程p.terminate()p.join()注意:進(jìn)程間不共享全局變量
進(jìn)程之間的通信-Queue
在初始化Queue()對象時(例如q=Queue(),若在括號中沒有指定最大可接受的消息數(shù)量,獲數(shù)量為負(fù)值時,那么就代表可接受的消息數(shù)量沒有上限一直到內(nèi)存盡頭)
Queue.qsize():返回當(dāng)前隊列包含的消息數(shù)量
Queue.empty():如果隊列為空,返回True,反之False
Queue.full():如果隊列滿了,返回True,反之False
Queue.get([block[,timeout]]):獲取隊列中的一條消息,然后將其從隊列中移除,
block默認(rèn)值為True。
如果block使用默認(rèn)值,且沒有設(shè)置timeout(單位秒),消息隊列如果為空,此時程序?qū)⒈蛔枞?#xff08;停在讀中狀態(tài)),直到消息隊列讀到消息為止,如果設(shè)置了timeout,則會等待timeout秒,若還沒讀取到任何消息,則拋出“Queue.Empty"異常:
Queue.get_nowait()相當(dāng)于Queue.get(False)
Queue.put(item,[block[,timeout]]):將item消息寫入隊列,block默認(rèn)值為True; 如果block使用默認(rèn)值,且沒有設(shè)置timeout(單位秒),消息隊列如果已經(jīng)沒有空間可寫入,此時程序?qū)⒈蛔枞?#xff08;停在寫入狀態(tài)),直到從消息隊列騰出空間為止,如果設(shè)置了timeout,則會等待timeout秒,若還沒空間,則拋出”Queue.Full"異常 如果block值為False,消息隊列如果沒有空間可寫入,則會立刻拋出"Queue.Full"異常; Queue.put_nowait(item):相當(dāng)Queue.put(item,False)
進(jìn)程間通信Demo:
from multiprocessing import Process.Queue import os,time,random #寫數(shù)據(jù)進(jìn)程執(zhí)行的代碼: def write(q):for value in ['A','B','C']:print("Put %s to queue...",%value)q.put(value)time.sleep(random.random()) #讀數(shù)據(jù)進(jìn)程執(zhí)行的代碼 def read(q):while True:if not q.empty():value = q.get(True)print("Get %s from queue.",%value)time.sleep(random.random())else:break if __name__=='__main__':#父進(jìn)程創(chuàng)建Queue,并傳給各個子進(jìn)程q = Queue()pw = Process(target=write,args=(q,))pr = Process(target=read,args=(q,))#啟動子進(jìn)程pw ,寫入:pw.start()#等待pw結(jié)束pw.join()#啟動子進(jìn)程pr,讀取:pr.start()pr.join()#pr 進(jìn)程里是死循環(huán),無法等待其結(jié)束,只能強(qiáng)行終止:print('')print('所有數(shù)據(jù)都寫入并且讀完') 進(jìn)程池Pool #coding:utf-8 from multiprocessing import Pool import os,time,randomdef worker(msg):t_start = time.time()print("%s 開始執(zhí)行,進(jìn)程號為%d"%(msg,os.getpid()))# random.random()隨機(jī)生成0-1之間的浮點數(shù)time.sleep(random.random()*2)t_stop = time.time()print(msg,"執(zhí)行完畢,耗時%0.2f”%(t_stop-t_start))po = Pool(3)#定義一個進(jìn)程池,最大進(jìn)程數(shù)3 for i in range(0,10):po.apply_async(worker,(i,)) print("---start----") po.close() po.join() print("----end----")進(jìn)程池中使用Queue
如果要使用Pool創(chuàng)建進(jìn)程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否則會得到如下的錯誤信息:
RuntimeError: Queue objects should only be shared between processs through inheritance
from multiprocessing import Manager,Pool import os,time,random def reader(q):print("reader 啟動(%s),父進(jìn)程為(%s)"%(os.getpid(),os.getpid()))for i in range(q.qsize()):print("reader 從Queue獲取到消息:%s"%q.get(True))def writer(q):print("writer 啟動(%s),父進(jìn)程為(%s)"%(os.getpid(),os.getpid()))for i ini "itcast":q.put(i) if __name__ == "__main__":print("(%s)start"%os.getpid())q = Manager().Queue()#使用Manager中的Queuepo = Pool()po.apply_async(wrtier,(q,))time.sleep(1)po.apply_async(reader,(q,))po.close()po.join()print("(%s)End"%os.getpid())107.談?wù)勀銓Χ噙M(jìn)程,多線程,以及協(xié)程的理解,項目是否用?
這個問題被問的概念相當(dāng)之大, 進(jìn)程:一個運行的程序(代碼)就是一個進(jìn)程,沒有運行的代碼叫程序,進(jìn)程是系統(tǒng)資源分配的最小單位,進(jìn)程擁有自己獨立的內(nèi)存空間,所有進(jìn)程間數(shù)據(jù)不共享,開銷大。
線程: cpu調(diào)度執(zhí)行的最小單位,也叫執(zhí)行路徑,不能獨立存在,依賴進(jìn)程存在,一個進(jìn)程至少有一個線程,叫主線程,而多個線程共享內(nèi)存(數(shù)據(jù)共享,共享全局變量),從而極大地提高了程序的運行效率。
協(xié)程: 是一種用戶態(tài)的輕量級線程,協(xié)程的調(diào)度完全由用戶控制。協(xié)程擁有自己的寄存器上下文和棧。協(xié)程調(diào)度時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復(fù)先前保存的寄存器上下文和棧,直接操中棧則基本沒有內(nèi)核切換的開銷,可以不加鎖的訪問全局變量,所以上下文的切換非常快。
108.Python異常使用場景有那些?
異步的使用場景:
1、 不涉及共享資源,獲對共享資源只讀,即非互斥操作
2、 沒有時序上的嚴(yán)格關(guān)系
3、 不需要原子操作,或可以通過其他方式控制原子性
4、 常用于IO操作等耗時操作,因為比較影響客戶體驗和使用性能
5、 不影響主線程邏輯
109.多線程共同操作同一個數(shù)據(jù)互斥鎖同步?
import threading import time class MyThread(threading.Thread):def run(self):global numtime.sleep(1)if mutex.acquire(1):num +=1msg = self.name + 'set num to ' +str(num)print msgmutex.release() num = 0 mutex = threading.Lock() def test():for i in range(5):t = MyThread()t.start() if __name__=="__main__":test()110.什么是多線程競爭?
線程是非獨立的,同一個進(jìn)程里線程是數(shù)據(jù)共享的,當(dāng)各個線程訪問數(shù)據(jù)資源時會出現(xiàn)競爭狀態(tài)即:數(shù)據(jù)幾乎同步會被多個線程占用,造成數(shù)據(jù)混亂,即所謂的線程不安全
那么怎么解決多線程競爭問題?---鎖
鎖的好處: 確保了某段關(guān)鍵代碼(共享數(shù)據(jù)資源)只能由一個線程從頭到尾完整地執(zhí)行能解決多線程資源競爭下的原子操作問題。
鎖的壞處: 阻止了多線程并發(fā)執(zhí)行,包含鎖的某段代碼實際上只能以單線程模式執(zhí)行,效率就大大地下降了
鎖的致命問題: 死鎖
111.請介紹一下Python的線程同步?
一、 setDaemon(False) 當(dāng)一個進(jìn)程啟動之后,會默認(rèn)產(chǎn)生一個主線程,因為線程是程序執(zhí)行的最小單位,當(dāng)設(shè)置多線程時,主線程會創(chuàng)建多個子線程,在Python中,默認(rèn)情況下就是setDaemon(False),主線程執(zhí)行完自己的任務(wù)以后,就退出了,此時子線程會繼續(xù)執(zhí)行自己的任務(wù),直到自己的任務(wù)結(jié)束。
例子
import threading import timedef thread():time.sleep(2)print('---子線程結(jié)束---')def main():t1 = threading.Thread(target=thread)t1.start()print('---主線程--結(jié)束')if __name__ =='__main__':main() #執(zhí)行結(jié)果 ---主線程--結(jié)束 ---子線程結(jié)束---二、 setDaemon(True) 當(dāng)我們使用setDaemon(True)時,這是子線程為守護(hù)線程,主線程一旦執(zhí)行結(jié)束,則全部子線程被強(qiáng)制終止
例子
import threading import time def thread():time.sleep(2)print(’---子線程結(jié)束---') def main():t1 = threading.Thread(target=thread)t1.setDaemon(True)#設(shè)置子線程守護(hù)主線程t1.start()print('---主線程結(jié)束---')if __name__ =='__main__':main() #執(zhí)行結(jié)果 ---主線程結(jié)束--- #只有主線程結(jié)束,子線程來不及執(zhí)行就被強(qiáng)制結(jié)束三、 join(線程同步) join 所完成的工作就是線程同步,即主線程任務(wù)結(jié)束以后,進(jìn)入堵塞狀態(tài),一直等待所有的子線程結(jié)束以后,主線程再終止。
當(dāng)設(shè)置守護(hù)線程時,含義是主線程對于子線程等待timeout的時間將會殺死該子線程,最后退出程序,所以說,如果有10個子線程,全部的等待時間就是每個timeout的累加和,簡單的來說,就是給每個子線程一個timeou的時間,讓他去執(zhí)行,時間一到,不管任務(wù)有沒有完成,直接殺死。
沒有設(shè)置守護(hù)線程時,主線程將會等待timeout的累加和這樣的一段時間,時間一到,主線程結(jié)束,但是并沒有殺死子線程,子線程依然可以繼續(xù)執(zhí)行,直到子線程全部結(jié)束,程序退出。
例子
import threading import timedef thread():time.sleep(2)print('---子線程結(jié)束---')def main():t1 = threading.Thread(target=thread)t1.setDaemon(True)t1.start()t1.join(timeout=1)#1 線程同步,主線程堵塞1s 然后主線程結(jié)束,子線程繼續(xù)執(zhí)行#2 如果不設(shè)置timeout參數(shù)就等子線程結(jié)束主線程再結(jié)束#3 如果設(shè)置了setDaemon=True和timeout=1主線程等待1s后會強(qiáng)制殺死子線程,然后主線程結(jié)束print('---主線程結(jié)束---')if __name__=='__main___':main()112.解釋以下什么是鎖,有哪幾種鎖?
鎖(Lock)是python提供的對線程控制的對象。有互斥鎖,可重入鎖,死鎖。
113.什么是死鎖?
若干子線程在系統(tǒng)資源競爭時,都在等待對方對某部分資源解除占用狀態(tài),結(jié)果是誰也不愿先解鎖,互相干等著,程序無法執(zhí)行下去,這就是死鎖。
GIL鎖 全局解釋器鎖
作用: 限制多線程同時執(zhí)行,保證同一時間只有一個線程執(zhí)行,所以cython里的多線程其實是偽多線程!
所以python里常常使用協(xié)程技術(shù)來代替多線程,協(xié)程是一種更輕量級的線程。
進(jìn)程和線程的切換時由系統(tǒng)決定,而協(xié)程由我們程序員自己決定,而模塊gevent下切換是遇到了耗時操作時才會切換
三者的關(guān)系:進(jìn)程里有線程,線程里有協(xié)程。
114.多線程交互訪問數(shù)據(jù),如果訪問到了就不訪問了?
怎么避免重讀?
創(chuàng)建一個已訪問數(shù)據(jù)列表,用于存儲已經(jīng)訪問過的數(shù)據(jù),并加上互斥鎖,在多線程訪問數(shù)據(jù)的時候先查看數(shù)據(jù)是否在已訪問的列表中,若已存在就直接跳過。
115.什么是線程安全,什么是互斥鎖?
每個對象都對應(yīng)于一個可稱為’互斥鎖‘的標(biāo)記,這個標(biāo)記用來保證在任一時刻,只能有一個線程訪問該對象。
同一進(jìn)程中的多線程之間是共享系統(tǒng)資源的,多個線程同時對一個對象進(jìn)行操作,一個線程操作尚未結(jié)束,另一線程已經(jīng)對其進(jìn)行操作,導(dǎo)致最終結(jié)果出現(xiàn)錯誤,此時需要對被操作對象添加互斥鎖,保證每個線程對該對象的操作都得到正確的結(jié)果。
116.說說下面幾個概念:同步,異步,阻塞,非阻塞?
同步: 多個任務(wù)之間有先后順序執(zhí)行,一個執(zhí)行完下個才能執(zhí)行。
異步: 多個任務(wù)之間沒有先后順序,可以同時執(zhí)行,有時候一個任務(wù)可能要在必要的時候獲取另一個同時執(zhí)行的任務(wù)的結(jié)果,這個就叫回調(diào)!
阻塞: 如果卡住了調(diào)用者,調(diào)用者不能繼續(xù)往下執(zhí)行,就是說調(diào)用者阻塞了。
非阻塞: 如果不會卡住,可以繼續(xù)執(zhí)行,就是說非阻塞的。
同步異步相對于多任務(wù)而言,阻塞非阻塞相對于代碼執(zhí)行而言。
117.什么是僵尸進(jìn)程和孤兒進(jìn)程?怎么避免僵尸進(jìn)程?
孤兒進(jìn)程: 父進(jìn)程退出,子進(jìn)程還在運行的這些子進(jìn)程都是孤兒進(jìn)程,孤兒進(jìn)程將被init 進(jìn)程(進(jìn)程號為1)所收養(yǎng),并由init 進(jìn)程對他們完成狀態(tài)收集工作。
僵尸進(jìn)程: 進(jìn)程使用fork 創(chuàng)建子進(jìn)程,如果子進(jìn)程退出,而父進(jìn)程并沒有調(diào)用wait 獲waitpid 獲取子進(jìn)程的狀態(tài)信息,那么子進(jìn)程的進(jìn)程描述符仍然保存在系統(tǒng)中的這些進(jìn)程是僵尸進(jìn)程。
避免僵尸進(jìn)程的方法:
1.fork 兩次用孫子進(jìn)程去完成子進(jìn)程的任務(wù)
2.用wait()函數(shù)使父進(jìn)程阻塞
3.使用信號量,在signal handler 中調(diào)用waitpid,這樣父進(jìn)程不用阻塞
118.python中進(jìn)程與線程的使用場景?
多進(jìn)程適合在CPU密集操作(cpu操作指令比較多,如位多的的浮點運算)。
多線程適合在IO密性型操作(讀寫數(shù)據(jù)操作比多的的,比如爬蟲)
119.線程是并發(fā)還是并行,進(jìn)程是并發(fā)還是并行?
線程是并發(fā),進(jìn)程是并行;
進(jìn)程之間互相獨立,是系統(tǒng)分配資源的最小單位,同一個線程中的所有線程共享資源。
120.并行(parallel)和并發(fā)(concurrency)?
并行: 同一時刻多個任務(wù)同時在運行
不會在同一時刻同時運行,存在交替執(zhí)行的情況。
實現(xiàn)并行的庫有: multiprocessing
實現(xiàn)并發(fā)的庫有: threading
程序需要執(zhí)行較多的讀寫、請求和回復(fù)任務(wù)的需要大量的IO操作,IO密集型操作使用并發(fā)更好。
CPU運算量大的程序,使用并行會更好
121.IO密集型和CPU密集型區(qū)別?
IO密集型: 系統(tǒng)運行,大部分的狀況是CPU在等 I/O(硬盤/內(nèi)存)的讀/寫
CPU密集型: 大部分時間用來做計算,邏輯判斷等CPU動作的程序稱之CPU密集型。
122.python asyncio的原理?
asyncio這個庫就是使用python的yield這個可以打斷保存當(dāng)前函數(shù)的上下文的機(jī)制, 封裝好了selector 擺脫掉了復(fù)雜的回調(diào)關(guān)系
網(wǎng)絡(luò)編程
123.怎么實現(xiàn)強(qiáng)行關(guān)閉客戶端和服務(wù)器之間的連接?
124.簡述TCP和UDP的區(qū)別以及優(yōu)缺點?
125.簡述瀏覽器通過WSGI請求動態(tài)資源的過程?
瀏覽器發(fā)送的請求被Nginx監(jiān)聽到,Nginx根據(jù)請求的URL的PATH或者后綴把請求靜態(tài)資源的分發(fā)到靜態(tài)資源的目錄,別的請求根據(jù)配置好的轉(zhuǎn)發(fā)到相應(yīng)端口。 實現(xiàn)了WSGI的程序會監(jiān)聽某個端口,監(jiān)聽到Nginx轉(zhuǎn)發(fā)過來的請求接收后(一般用socket的recv來接收HTTP的報文)以后把請求的報文封裝成environ的字典對象,然后再提供一個start_response的方法。把這兩個對象當(dāng)成參數(shù)傳入某個方法比如wsgi_app(environ, start_response)或者實現(xiàn)了__call__(self, environ, start_response)方法的某個實例。這個實例再調(diào)用start_response返回給實現(xiàn)了WSGI的中間件,再由中間件返回給Nginx。
126.描述用瀏覽器訪問www.baidu.com的過程
127.Post和Get請求的區(qū)別?
128.cookie 和session 的區(qū)別?
129.列出你知道的HTTP協(xié)議的狀態(tài)碼,說出表示什么意思?
130.請簡單說一下三次握手和四次揮手?
131.說一下什么是tcp的2MSL?
132.為什么客戶端在TIME-WAIT狀態(tài)必須等待2MSL的時間?
133.說說HTTP和HTTPS區(qū)別?
134.談一下HTTP協(xié)議以及協(xié)議頭部中表示數(shù)據(jù)類型的字段?
135.HTTP請求方法都有什么?
136.使用Socket套接字需要傳入哪些參數(shù) ?
137.HTTP常見請求頭?
138.七層模型?
139.url的形式?
總結(jié)
以上是生活随笔為你收集整理的Python面试题大全(二):python高级语法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android之Fragment(一)
- 下一篇: 爆款专栏《Python 黑科技》目录导航