java回調(diào)函數(shù)的使用場景 為什么Python工程師很少像Java工程師那樣討論垃圾回收?
為什么Python工程師很少像Java工程師那樣討論垃圾回收?如何管理白記憶中的杜?Python中主要有三種內(nèi)存管理機(jī)制:引用計(jì)數(shù)zhi機(jī)制、垃圾收集dao機(jī)制和內(nèi)存池機(jī)制。A.引用計(jì)數(shù)當(dāng)一個(gè)對象被賦
為什么Python工程師很少像Java工程師那樣討論垃圾回收?
如何管理白記憶中的杜?
Python中主要有三種內(nèi)存管理機(jī)制:引用計(jì)數(shù)zhi機(jī)制、垃圾收集dao機(jī)制和內(nèi)存池機(jī)制。
A.引用計(jì)數(shù)
當(dāng)一個(gè)對象被賦予一個(gè)新的名字或被放入一個(gè)容器(列表、元組或字典)時(shí),該對象的引用計(jì)數(shù)將增加。
當(dāng)del用于表示一個(gè)對象被銷毀或者引用超過動(dòng)作或者被重新分配時(shí),該對象的引用計(jì)數(shù)將會(huì)減少。
您可以使用()函數(shù)來獲取對象的當(dāng)前引用計(jì)數(shù)。在大多數(shù)情況下,引用計(jì)數(shù)比我們猜測的要大得多。對于不可變的數(shù)據(jù)(數(shù)字和字符串),解釋器會(huì)在程序的不同部分共享內(nèi)存以節(jié)省內(nèi)存。
B.碎片帳集
當(dāng)對象的引用計(jì)數(shù)歸零時(shí),它將被垃圾收集機(jī)制處理掉。
當(dāng)...的時(shí)候
當(dāng)兩個(gè)對象A和B相互引用時(shí),del語句可以減少A和B的引用計(jì)數(shù),并銷毀用于引用底層對象的名稱。但是,由于每個(gè)對象都包含對其他對象的應(yīng)用程序,因此引用
計(jì)數(shù)不會(huì)歸零,對象也不會(huì)被銷毀。(導(dǎo)致內(nèi)存泄漏)。為了解決這個(gè)問題,解釋器將定期執(zhí)行循環(huán)檢測器來搜索不可訪問對象的循環(huán)并刪除它們。
C.內(nèi)存池機(jī)制
Python為內(nèi)存提供了垃圾收集機(jī)制,但是它將未使用的內(nèi)存放入內(nèi)存池,而不是返回給操作系統(tǒng)。
1)Pymalloc機(jī)制。為了加快Python的執(zhí)行效率,Python引入了內(nèi)存池機(jī)制來管理小塊內(nèi)存的申請和釋放。
2)Python中所有小于256字節(jié)的對象都使用pymalloc實(shí)現(xiàn)的分配器,而大型對象使用系統(tǒng)的malloc。
3) Python對象,比如整數(shù)、浮點(diǎn)數(shù)、List,都有自己的私有內(nèi)存池,對象不共享自己的內(nèi)存池。也就是說,如果你分配釋放了大量的整數(shù),那么用來緩存這些整數(shù)的內(nèi)存就不能再分配給浮點(diǎn)數(shù)了。
【Python環(huán)境】12個(gè)Python面試問題匯總
2.什么是lambda函數(shù)?它有什么好處?
Lambda表達(dá)式通常在你需要一個(gè)函數(shù)的時(shí)候使用,但是你不需要。;t不想費(fèi)事給它起名字,就是匿名函數(shù)。
Lambda函數(shù):主要目的是指出短回調(diào)函數(shù)。
lambda[參數(shù)]:表達(dá)式
gtgtgt alambda x,y:x y
gtgtgt a(3,11)
3.如何在Python中實(shí)現(xiàn)元組和列表的轉(zhuǎn)換?
直接用tuple和list函數(shù)就行了,type()可以確定對象的類型。
4.請寫一個(gè)Python代碼實(shí)現(xiàn)。刪除列表中的重復(fù)元素。
這個(gè)地方可以用set來實(shí)現(xiàn)。
5.如何在Python中復(fù)制一個(gè)對象?(賦值、淺拷貝和深拷貝的區(qū)別)
賦值()是創(chuàng)建一個(gè)對象的新引用,修改任何一個(gè)變量都會(huì)影響到另一個(gè)。
淺拷貝:創(chuàng)建一個(gè)新的對象,但是它包含了對原對象所包含的項(xiàng)的引用(如果引用修改了一個(gè)對象,那么另一個(gè)對象也會(huì)被修改改變){1、全切片法;2、工廠函數(shù),比如list();3、復(fù)制模塊的copy()函數(shù)}
深層復(fù)制:新建一個(gè)對象,遞歸復(fù)制它包含的對象(修改一個(gè),另一個(gè)不變){()復(fù)制模塊的函數(shù)}
6.介紹except的用法和作用?
嘗試…除了…除了…[其他…][最后…]
執(zhí)行try下的語句,如果拋出異常,執(zhí)行會(huì)跳轉(zhuǎn)到except語句。嘗試按順序執(zhí)行except中的每個(gè)分支,如果拋出的異常與except中的異常組匹配,則執(zhí)行相應(yīng)的語句。如果所有異常都不匹配,異常將被傳遞給調(diào)用此代碼的下一個(gè)最高級別的try代碼。
如果try下的語句正常執(zhí)行,則執(zhí)行else塊代碼。如果出現(xiàn)異常,將不會(huì)執(zhí)行。
如果finally語句存在,它最終將總是被執(zhí)行。
【Python環(huán)境】12個(gè)Python面試問題匯總
7.什么?;Python中match()和search()的區(qū)別是什么?
re模塊中的Match(pattern,string [,flags]),并檢查字符串的開頭是否與模式匹配。
在re模塊中,research(pattern,string [,flags])在string中搜索模式的第一個(gè)匹配值。
gtgtgt print((;超級;,;迷信;)。span())
(0, 5)
gtgtgt print((;超級;,;無法超越;))
沒有人
gtgtgt print((;超級;,;迷信;)。span())
(0, 5)
gtgtgt print((;超級;,;無法超越;)。span())
(2, 7)
8.用Python匹配HTML標(biāo)簽時(shí),lt.*gt和lt.*?什么?;gt的區(qū)別是什么?
這些術(shù)語稱為貪婪匹配(lt.*gt)和非貪婪匹配(lt.*?gt)
例如:
試驗(yàn)
lt.*gt:
試驗(yàn)
lt。*?gt:
9.以下代碼的輸出會(huì)是什么?說出你的答案并解釋。
輸出:
讓你不解或驚訝的是,最后一行的輸出是3 ^ 2 ^ 3而不是3 ^ 2 ^ 1。為什么改變Parent.x的值會(huì)改變Child2.x的值,但同時(shí)Child1.x的值不變?
這
這個(gè)答案的關(guān)鍵是在Python中
類變量在內(nèi)部被視為字典。如果在當(dāng)前類的字典中沒有找到變量名,將搜索祖先類(如父類),直到找到被引用的變量名(如果被引用的變量名
變量名在其自己的類或其祖先類中找不到,這將引發(fā)AttributeError異常)。
因此,在父類中設(shè)置x 1將使對該類及其任何子類的引用中的類變量x 1的值。這是因?yàn)榈谝粋€(gè)print語句的輸出是1 1 1。
隨后,如果它的任何子類重寫了該值(例如,我們執(zhí)行語句Child1.x 2),那么該值只在子類中發(fā)生變化。這就是為什么第二個(gè)print語句的輸出是1 2 1。
最后,如果父類中的值發(fā)生變化(例如,我們執(zhí)行語句Parent.x 3),這種變化將影響任何沒有覆蓋該值的子類中的值(在本例中,受影響的子類是Child2)。這就是為什么第三次打印輸出是3 2 3。
10.下面的代碼會(huì)輸出什么?
回答
上述代碼將輸出[],并且不會(huì)導(dǎo)致Ind
什么是線程池,如何使用,為什么要用?
首先,線程池的作用:
線程池的作用是限制系統(tǒng)中執(zhí)行線程的數(shù)量。
根據(jù)系統(tǒng)的環(huán)境,可以自動(dòng)或手動(dòng)設(shè)置線程數(shù)量,以達(dá)到最佳運(yùn)行效果;少了浪費(fèi)系統(tǒng)資源,多了造成系統(tǒng)擁塞,效率低下。使用線程池控制線程數(shù)量,其他線程排隊(duì)等待。在一個(gè)任務(wù)被執(zhí)行后,從隊(duì)列中取出前面的任務(wù)并開始執(zhí)行。如果隊(duì)列中沒有正在等待的進(jìn)程,那么線程池的這個(gè)資源正在等待。當(dāng)一個(gè)新任務(wù)需要運(yùn)行時(shí),如果線程池中有等待的工作線程,就可以開始運(yùn)行;否則,進(jìn)入等待隊(duì)列。
二、如何使用:
配置一個(gè)線程池比較復(fù)雜,尤其是如果不清楚線程池的原理,很有可能配置的線程池不是最優(yōu)的,所以在Executors類中提供了一些靜態(tài)工廠來生成一些常用的線程池。
創(chuàng)建單線程線程池。這個(gè)線程池中只有一個(gè)線程在工作,相當(dāng)于單個(gè)線程串行執(zhí)行所有任務(wù)。如果這個(gè)唯一的線程由于異常而結(jié)束,一個(gè)新的線程將取代它。這個(gè)線程池確保所有任務(wù)按照提交的順序執(zhí)行。
創(chuàng)建一個(gè)固定大小的線程池。每次提交任務(wù)時(shí)創(chuàng)建一個(gè)線程,直到線程達(dá)到線程池的最大大小。一旦線程池的大小達(dá)到最大值,它將保持不變。如果一個(gè)線程由于執(zhí)行異常而結(jié)束,線程池將被一個(gè)新線程補(bǔ)充。
?
1.創(chuàng)建和銷毀線程的數(shù)量減少了,每個(gè)工作線程可以重用來執(zhí)行多個(gè)任務(wù)。2.根據(jù)系統(tǒng) s的承載能力,可以調(diào)整線程池中工作線程的數(shù)量,防止服務(wù)器因內(nèi)存消耗過大而耗盡(每個(gè)線程需要1MB左右的內(nèi)存,打開的線程越多,消耗的內(nèi)存越多,最后崩潰)。
Java中線程池的頂層接口是Executor,但嚴(yán)格來說Executor并不是線程池,只是一個(gè)執(zhí)行線程的工具。真正的線程池接口是ExecutorService。