1.可變類型和不可變類型
可變類型有l(wèi)ist休溶,dict代赁。不可變類型有string,number兽掰,tuple芭碍。
當(dāng)進(jìn)行修改操作時(shí),可變類型傳遞的是內(nèi)存中的地址孽尽,也就是說(shuō)窖壕,直接修改內(nèi)存中的值,并沒(méi)有開(kāi)辟新的內(nèi)存。
不可變類型被改變時(shí)艇拍,并沒(méi)有改變?cè)瓋?nèi)存地址中的值狐蜕,而是開(kāi)辟一塊新的內(nèi)存,將原地址中的值復(fù)制過(guò)去卸夕,對(duì)這塊新開(kāi)辟的內(nèi)存中的值進(jìn)行操作。
2.深淺拷貝的實(shí)現(xiàn)方式婆瓜,區(qū)別快集;deepcopy如果你來(lái)設(shè)計(jì),如何實(shí)現(xiàn)廉白?
#最簡(jiǎn)單的深拷貝个初,改變一個(gè)不可變類型
string = "abcd"
print(id(string)) #output:2314121499680
string += "efg"
print(string) #output:abcdefg
print(id(string)) #output:2314122360176
這里利用id來(lái)打印對(duì)象的10進(jìn)制內(nèi)存地址『秕澹可以發(fā)現(xiàn)string在拼接字符串后地址發(fā)生了變化院溺,也就是引用指向了另外一塊地址。
#最簡(jiǎn)單的深拷貝磅轻,改變一個(gè)不可變類型
string = "abcd"
print(id(string))
string += "efg"
print(string)
print(id(string))
#淺拷貝
b = string
print(b)
print(id(b))
接著剛才的例子又寫了一個(gè)淺拷貝珍逸,所謂淺拷貝就是復(fù)制是引用,也就是讓這兩個(gè)對(duì)象指向同一塊內(nèi)存地址聋溜。
如果我來(lái)實(shí)現(xiàn)深拷貝谆膳,我會(huì)為對(duì)象創(chuàng)建一個(gè)副本,所有的操作都指向這個(gè)副本撮躁。
對(duì)深拷貝一般是容器漱病,比如list“崖可以import copy杨帽,調(diào)用copy.deepcopy()函數(shù)。
順便說(shuō)一句嗤军,copy.deepcopy()和copy.copy()一般都用于容器注盈,深拷貝對(duì)不可變類型無(wú)效。
3.new() 和 init()的區(qū)別型雳?
官方文檔是這樣說(shuō)的:
- init()是當(dāng)實(shí)例對(duì)象創(chuàng)建完成后被調(diào)用的当凡,然后設(shè)置對(duì)象屬性的一些初始值。
-
new()是在實(shí)例被創(chuàng)建前調(diào)用纠俭,因?yàn)樗娜蝿?wù)就是創(chuàng)建實(shí)例然后返回該實(shí)例沿量,是個(gè)靜態(tài)方法。
也就是說(shuō)冤荆,new()在init()之前被調(diào)用朴则,new()返回的實(shí)例將會(huì)傳遞給init()的第一個(gè)參數(shù),然后init()在初始化對(duì)象的屬性钓简。
4.你知道幾種設(shè)計(jì)模式乌妒?描述一下他們的特點(diǎn)
策略模式汹想、適配器模式、工廠模式撤蚊、裝飾器模式古掏、單例模式
策略模式:
策略模式是一種與行為相關(guān)的設(shè)計(jì)模式,允許你在運(yùn)行時(shí)根據(jù)指定的上下文確定程序的動(dòng)作侦啸〔弁伲可以在兩個(gè)類中封裝不同的算法,并在程序運(yùn)行時(shí)確定具體使用哪一種光涂。
適配器模式:
適配器模式是一個(gè)結(jié)構(gòu)性的設(shè)計(jì)模式庞萍,允許通過(guò)不同的接口為一個(gè)類賦予新的用途,這使得使用不用調(diào)用方式的系統(tǒng)都能夠使用這個(gè)類忘闻。
工廠模式:
工廠模式是一種創(chuàng)建型的設(shè)計(jì)模式钝计,作用如其名稱:就像工廠一樣生產(chǎn)對(duì)象實(shí)例的類。
這個(gè)模式的主要目的是將可能設(shè)計(jì)到很多類的對(duì)象的創(chuàng)建過(guò)程封裝到一個(gè)單獨(dú)的方法中齐佳,通過(guò)給定的上下文輸出指定的對(duì)象實(shí)例私恬。
裝飾器模式:
裝飾器模式是一個(gè)結(jié)構(gòu)性模式,允許我們根據(jù)情況重虑,在運(yùn)行時(shí)為一個(gè)對(duì)象添加新的或者附加的行為践付。
目的是為給一個(gè)特定的對(duì)象實(shí)例應(yīng)用擴(kuò)展的函數(shù)方法,并且同時(shí)也能夠產(chǎn)生沒(méi)有新方法的原對(duì)象缺厉。
單例模式:
單例模式是一個(gè)創(chuàng)見(jiàn)型的模式永高,功能是確保運(yùn)行時(shí)對(duì)某個(gè)類只存在一個(gè)實(shí)例對(duì)象,并且提供一個(gè)全局訪問(wèn)點(diǎn)來(lái)訪問(wèn)這個(gè)實(shí)例對(duì)象提针。
因?yàn)閷?duì)于調(diào)用單例的其他對(duì)象而言命爬,這個(gè)全局唯一的訪問(wèn)點(diǎn)“協(xié)調(diào)”了對(duì)單例對(duì)象的訪問(wèn)請(qǐng)求,所以調(diào)用者看到的單例內(nèi)變量將會(huì)是同一份辐脖。
5.編碼和解碼你是怎么理解的饲宛?
計(jì)算機(jī)中存儲(chǔ)的信息都是二進(jìn)制數(shù)據(jù)。編碼和解碼本質(zhì)上是一種映射關(guān)系嗜价,比如‘a(chǎn)’用ascii編碼是65艇抠,計(jì)算機(jī)中存儲(chǔ)的是00110101.
編碼:真實(shí)字符串->二進(jìn)制串
解碼:二進(jìn)制串->真實(shí)字符串
熟知的編碼類型有ascii,utf-8久锥,unicode家淤。
ascii以1字節(jié)8bit表示一個(gè)字符,首位都是0瑟由,表示的字符集明顯不夠用絮重。
unicode編碼是為了表達(dá)任意語(yǔ)言而設(shè)計(jì)的,為了防止存儲(chǔ)上的冗余,采用了變長(zhǎng)編碼青伤,但是變長(zhǎng)編碼給解碼帶來(lái)了困難督怜,無(wú)法判斷幾個(gè)字節(jié)表示一個(gè)字符。
utf-8是針對(duì)unicode變長(zhǎng)編碼設(shè)計(jì)的一種前綴編碼狠角,根據(jù)前綴可判斷幾個(gè)字節(jié)表示一個(gè)字符号杠。
在Python中,編碼/解碼是不同編碼系統(tǒng)之間的轉(zhuǎn)換丰歌,默認(rèn)情況下轉(zhuǎn)換目標(biāo)是unicode究流。
編碼:unicode->字節(jié)流,字節(jié)流->unicode
對(duì)于一個(gè)字符串可以這樣完成不同的編碼
str1 = "abc"
enstr = str1.encode('utf-8') #編碼
destr = enstr.decode('utf-8') #解碼
Python文件的編碼格式
保存文件時(shí)动遭,對(duì)py文件可在前兩行注明編碼方式# -- coding: UTF-8 --