一)朴肺、這兩個(gè)參數(shù)是什么意思:*args,**kwargs坚洽?我們?yōu)槭裁匆褂盟鼈儯?br>
答:如果我們不確定往一個(gè)函數(shù)中傳入多少參數(shù)戈稿,或者我們希望以元組(tuple)或者列表(list)的形式傳參數(shù)的時(shí)候,我們可以使用*args(單星號(hào))酪术。如果我們不知道往函數(shù)中傳遞多少個(gè)關(guān)鍵詞參數(shù)或者想傳入字典的值作為關(guān)鍵詞參數(shù)的時(shí)候我們可以使用**kwargs(雙星號(hào))器瘪,args、kwargs兩個(gè)標(biāo)識(shí)符是約定俗成的用法绘雁。
另一種答法:當(dāng)函數(shù)的參數(shù)前面有一個(gè)星號(hào)*號(hào)的時(shí)候表示這是一個(gè)可變的位置參數(shù)橡疼,兩個(gè)星號(hào)**表示這個(gè)是一個(gè)可變的關(guān)鍵詞參數(shù)。星號(hào)*把序列或者集合解包(unpack)成位置參數(shù)庐舟,兩個(gè)星號(hào)**把字典解包成關(guān)鍵詞參數(shù)欣除。
代碼理解一下
二)、談一談Python的裝飾器(decorator)
裝飾器本質(zhì)上是一個(gè)Python函數(shù)挪略,它可以讓其它函數(shù)在不作任何變動(dòng)的情況下增加額外功能历帚,裝飾器的返回值也是一個(gè)函數(shù)對(duì)象。它經(jīng)常用于有切面需求的場(chǎng)景杠娱。比如:插入日志挽牢、性能測(cè)試、事務(wù)處理摊求、緩存禽拔、權(quán)限校驗(yàn)等。有了裝飾器我們就可以抽離出大量的與函數(shù)功能無(wú)關(guān)的雷同代碼進(jìn)行重用室叉。
三)睹栖、簡(jiǎn)要描述Python的垃圾回收機(jī)制(garbage collection)
Python中的垃圾回收是以引用計(jì)數(shù)為主,標(biāo)記-清除和分代收集為輔茧痕。
引用計(jì)數(shù):Python在內(nèi)存中存儲(chǔ)每個(gè)對(duì)象的引用計(jì)數(shù)野来,如果計(jì)數(shù)變成0,該對(duì)象就會(huì)消失踪旷,分配給該對(duì)象的內(nèi)存就會(huì)釋放出來(lái)曼氛。
標(biāo)記-清除:一些容器對(duì)象豁辉,比如list、dict搪锣、tuple秋忙,instance等可能會(huì)出現(xiàn)引用循環(huán)彩掐,對(duì)于這些循環(huán)构舟,垃圾回收器會(huì)定時(shí)回收這些循環(huán)(對(duì)象之間通過(guò)引用(指針)連在一起,構(gòu)成一個(gè)有向圖堵幽,對(duì)象構(gòu)成這個(gè)有向圖的節(jié)點(diǎn)狗超,而引用關(guān)系構(gòu)成這個(gè)有向圖的邊)。
分代收集:Python把內(nèi)存根據(jù)對(duì)象存活時(shí)間劃分為三代朴下,對(duì)象創(chuàng)建之后努咐,垃圾回收器會(huì)分配它們所屬的代。每個(gè)對(duì)象都會(huì)被分配一個(gè)代殴胧,而被分配更年輕的代是被優(yōu)先處理的渗稍,因此越晚創(chuàng)建的對(duì)象越容易被回收。
四)团滥、Python多線程(multi-threading)竿屹。這是個(gè)好主意嗎?
Python并不支持真正意義上的多線程灸姊,Python提供了多線程包拱燃。Python中有一個(gè)叫Global Interpreter Lock(GIL)的東西,它能確保你的代碼中永遠(yuǎn)只有一個(gè)線程在執(zhí)行力惯。經(jīng)過(guò)GIL的處理碗誉,會(huì)增加執(zhí)行的開(kāi)銷。這就意味著如果你先要提高代碼執(zhí)行效率父晶,使用threading不是一個(gè)明智的選擇哮缺,當(dāng)然如果你的代碼是IO密集型,多線程可以明顯提高效率甲喝,相反如果你的代碼是CPU密集型的這種情況下多線程大部分是雞肋尝苇。
五)、 說(shuō)明os,sys模塊不同俺猿,并列舉常用的模塊方法茎匠?
官方文檔: os模板提供了一種方便的使用操作系統(tǒng)函數(shù)的方法
sys模板可供訪問(wèn)由解釋器使用或維護(hù)的變量和與解釋器交互的函數(shù)
另一種回答:os模塊負(fù)責(zé)程序與操作系統(tǒng)的交互,提供了訪問(wèn)操作系統(tǒng)底層的接口押袍。sys模塊負(fù)責(zé)程序與Python解釋器的交互诵冒,提供了一系列的函數(shù)和變量用戶操作Python運(yùn)行時(shí)的環(huán)境。
六)谊惭、什么是lambda表達(dá)式汽馋?它有什么好處侮东?
簡(jiǎn)單來(lái)說(shuō),lambda表達(dá)式通常是當(dāng)你需要使用一個(gè)函數(shù)豹芯,但是又不想費(fèi)腦袋去命名一個(gè)函數(shù)的時(shí)候使用悄雅,也就是通常所說(shuō)的匿名函數(shù)。lambda表達(dá)式一般的形式是:關(guān)鍵詞lambda后面緊接一個(gè)或多個(gè)參數(shù)铁蹈,緊接一個(gè)冒號(hào)“:”宽闲,緊接一個(gè)表達(dá)式。lambda表達(dá)式是一個(gè)表達(dá)式不是一個(gè)語(yǔ)句握牧。
七)容诬、Python中pass語(yǔ)句的作用是什么?
pass語(yǔ)句不會(huì)執(zhí)行任何操作沿腰,一般作為占位符或者創(chuàng)建占位程序
(八)览徒、Python是如何進(jìn)行類型轉(zhuǎn)換的?
Python提供了將變量或值從一種類型轉(zhuǎn)換為另一種類型的內(nèi)置方法颂龙。
九)习蓬、Python里面如何拷貝一個(gè)對(duì)象?
Python中對(duì)象之間的賦值是按引用傳遞的措嵌,如果要拷貝對(duì)象需要使用標(biāo)準(zhǔn)模板中的copy
copy.copy:淺拷貝躲叼,只拷貝父對(duì)象,不拷貝父對(duì)象的子對(duì)象铅匹。
copy.deepcopy:深拷貝押赊,拷貝父對(duì)象和子對(duì)象。
十)包斑、__new__和__init__的區(qū)別流礁。
__init__為初始化方法,__new__方法是真正的構(gòu)造函數(shù)罗丰。
__new__是實(shí)例創(chuàng)建之前被調(diào)用神帅,它的任務(wù)是創(chuàng)建并返回該實(shí)例,是靜態(tài)方法
__init__是實(shí)例創(chuàng)建之后被調(diào)用的萌抵,然后設(shè)置對(duì)象屬性的一些初始值找御。
總結(jié):__new__方法在__init__方法之前被調(diào)用,并且__new__方法的返回值將傳遞給__init__方法作為第一個(gè)參數(shù)绍填,最后__init__給這個(gè)實(shí)例設(shè)置一些參數(shù)霎桅。
十一)、Python中單下劃線和雙下劃線分別是什么讨永?
__name__:一種約定滔驶,Python內(nèi)部的名字,用來(lái)與用戶自定義的名字區(qū)分開(kāi)卿闹,防止沖突
_name:一種約定揭糕,用來(lái)指定變量私有
__name:解釋器用_classname__name來(lái)代替這個(gè)名字用以區(qū)別和其他類相同的命名
十二)萝快、說(shuō)一說(shuō)Python自省。
自省就是面向?qū)ο蟮恼Z(yǔ)言所寫(xiě)的程序在運(yùn)行時(shí)著角,所能知道對(duì)象的類型揪漩。簡(jiǎn)單一句話就是運(yùn)行時(shí)能夠獲得對(duì)象的類型。比如:type()吏口、dir()奄容、getattr()、hasattr()锨侯、isinstance()