我們開始真正地討論P(yáng)ython3000了。這里有一個(gè)新的郵件列表和一個(gè)版本分支。首要的問題是關(guān)于流程的。Python 增強(qiáng)建議書(Python Enhancement Proposal,簡(jiǎn)稱PEP)的很多新格式正在制定,目的是為了避免重蹈Perl 6的覆轍:-)。我在blog一個(gè)關(guān)于功能的提案,這個(gè)提案在過去一段時(shí)間里已經(jīng)發(fā)生了很大的變化)
創(chuàng)新互聯(lián)建站2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元新寧做網(wǎng)站,已為上家服務(wù),為新寧各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220
自盤古開天地之日起,Alex Martelli就一直是配接的忠實(shí)擁護(hù)者。他經(jīng)常埋怨我對(duì)配接的光芒視而不見。現(xiàn)在,我為自己當(dāng)時(shí)的不開竅而感到慶幸。
我先用最簡(jiǎn)單的形式來介紹一下配接吧。 這個(gè)想法誕生于一種常有的情況:需要用到對(duì)象包裝器(object wrapper)[貼切地命名為配接器模式(Adapter Pattern)]。PEP246打算提供一個(gè)內(nèi)置的函數(shù)adapt(X, P), X可以是任何對(duì)象,而P也可以是任何Protocol。我們故意不對(duì)protocol進(jìn)行定義,只要它可以通過對(duì)象表現(xiàn)出來就可以。調(diào)用adapt(X, P)返回一個(gè)由X構(gòu)建并滿足P的對(duì)象,如果創(chuàng)建對(duì)象失敗,則拋出一個(gè)異常。它使用全局注冊(cè)表(global registry)為配接器功能提供了類型和protocol之間的映射關(guān)系。我們可以寫為dict R = {(T, P): A, ...}。然后,adapt(X, P) 計(jì)算出adapter A = R[type(X), P],并返回A(X)。 還有一個(gè)注冊(cè)函數(shù)register(T, P, A),它簡(jiǎn)單地設(shè)置 R[T, P] = A。請(qǐng)參見Alex更為精彩的解釋,他補(bǔ)充了很多我遺漏掉的東西。
當(dāng)Alex提出他對(duì)配接工作原理的這一看法,好幾個(gè)人(包括我自己在內(nèi))都意識(shí)到全局注冊(cè)表是沒有必要的。每個(gè)protocol都可以有自己的注冊(cè)表(registry)。所以,現(xiàn)在我們?cè)趐rotocol上使用adapt()和register()方法。我們使用P.adapt(X)而非adapt(X, P),使用P.register(T, A)而非register(T, P, A)。A的簽名(signature)保持不變。我稱之為第二代配接(second-generation adaptation)。
這樣做的好處是你們?cè)僖膊挥镁窒抻谝环N固定的全局的register()和adapt()實(shí)現(xiàn)。Alex提到了很多他忽略的問題,但是如果要真正實(shí)現(xiàn),這些問題需要得以解決。例如,如何處理對(duì)象類型未被注冊(cè)而一些基本類型已被注冊(cè)的配接,protocol之間的繼承是如何定義的(當(dāng)你把protocol和接口等同起來時(shí)會(huì)很有用,就像Zope和Twisted一樣),對(duì)象已實(shí)現(xiàn)protocol/接口時(shí)的自動(dòng)檢測(cè)(這在Zope和Twisted中有用)。一些擴(kuò)展(extension)有在查找(lookup)的性能上有問題,我們可以通過幾種不同的方法來解決。通過多重協(xié)議實(shí)現(xiàn)(multiple protocol implementations)(每次都實(shí)現(xiàn)相同的adapt()和register() APIs),每個(gè)框架(framework)都對(duì)配接如何為其自身擁有的protocol服務(wù)有自己的主張,而沒必要使用一個(gè)固定的全局實(shí)現(xiàn)。對(duì)于一個(gè)特定的框架而言,配接的全局實(shí)現(xiàn)可能達(dá)到最佳效果,但也未必就是最好的選擇。
Ian Bicking提出了一個(gè)對(duì)立的觀點(diǎn):我們?yōu)槭裁床皇褂梅盒秃瘮?shù)而非配接呢?他和Phillip Eby都認(rèn)為泛型函數(shù)具有的功能比配接器更強(qiáng)大,至少在某種程度上差不多。現(xiàn)在我就來簡(jiǎn)要說一下泛型函數(shù)。
一個(gè)泛型函數(shù)G,可以被調(diào)用,這種行為類似一個(gè)普通函數(shù)(取參數(shù)并返回一個(gè)值),但其實(shí)現(xiàn)是可擴(kuò)展的(extensible),并可以在不同的模塊中進(jìn)行定義。TG包含一個(gè)由復(fù)合類型參數(shù)的元組索引的注冊(cè)表實(shí)現(xiàn)。假設(shè)我們想讓具有兩個(gè)參數(shù)的G可調(diào)用,那么注冊(cè)表將會(huì)把成對(duì)了類型組(type pairs)映射到實(shí)現(xiàn)的函數(shù)中。我們可以使用G.register((T1, T2), F) 來顯示地定義,當(dāng)type(X1)==T1、type(X2)==T2時(shí),F(xiàn)(X1, X2)是G(X1, X2)的合適的實(shí)現(xiàn)。 最簡(jiǎn)單的實(shí)現(xiàn)就是把參數(shù)映射到它們的類型(類或許更好),轉(zhuǎn)換為元組,并利用它作為注冊(cè)表的鍵值來找到實(shí)現(xiàn)函數(shù)。如果沒有找到健值,就調(diào)用缺省實(shí)現(xiàn),前提是預(yù)先定義G,并提供一些回調(diào)或拋出一個(gè)異常。
一個(gè)有用的泛型函數(shù)實(shí)現(xiàn)也必須支持在參數(shù)類型的基本類型上查找匹配。這就是使事情變得復(fù)雜的地方,特別是當(dāng)你有多個(gè)參數(shù)時(shí)。例如,你有一個(gè)實(shí)現(xiàn)方案,它與第一個(gè)參數(shù)完全匹配,基本類型與第二個(gè)參數(shù)匹配;另一個(gè)實(shí)現(xiàn)方案是,它與第二個(gè)參數(shù)完全匹配,基本類型與第一個(gè)參數(shù)匹配。這種情況下,你會(huì)選擇哪一種?Phillip Eby的實(shí)現(xiàn)、RuleDispatch (part of PEAK) 拒絕做出猜測(cè); 如果沒有占優(yōu)勢(shì)的實(shí)現(xiàn)方案(不管它是什么意思),都會(huì)拋出異常。你可以通過注冊(cè)一個(gè)更加具體的簽名來徹底解決問題。
C++用戶會(huì)認(rèn)為泛型函數(shù)是一個(gè)C++編譯器用來解決函數(shù)重載問題的策略的運(yùn)行時(shí)實(shí)現(xiàn)。幸運(yùn)的是,我們不需要與C向后兼容,從而避免了重蹈C++的錯(cuò)誤(如,導(dǎo)致浮點(diǎn)類型的優(yōu)先級(jí)高于布爾類型)。Lisp或 Dylan用戶(不知是否還存在:-),以及PyPy 開發(fā)者會(huì)認(rèn)為它們是多重方法(multi-methods)。
為了對(duì)比上述兩種觀點(diǎn),我提出了一個(gè)關(guān)于配接和泛型函數(shù)的一個(gè)簡(jiǎn)單版本,通過這一版本來再現(xiàn)內(nèi)置iter()函數(shù)的重復(fù)實(shí)現(xiàn)。我在注冊(cè)表中使用了描述符,這使得簽名與我上面所述有一些輕微的差別,但實(shí)質(zhì)是一樣的。
勝負(fù)分曉了
現(xiàn)在我們已經(jīng)為慶祝時(shí)刻做好準(zhǔn)備了。Tim Hochberg獨(dú)立開發(fā)的一個(gè)可以替代的Protocol版本給我們帶來了這一歡樂時(shí)刻。P.adapt(X)只是泛型函數(shù)G(x) 調(diào)用的另外一種冗長(zhǎng)形式罷了。
有趣的是,Alex費(fèi)了一些周折才開始喜歡上它。他過去一直認(rèn)為配接的功能更強(qiáng)大,因?yàn)榕浣涌梢苑祷貙?shí)現(xiàn)多個(gè)方法的對(duì)象,而泛型函數(shù)要實(shí)現(xiàn)同樣的功能則要求每個(gè)方法都有一個(gè)單獨(dú)的泛型函數(shù)。當(dāng)然,我們可以使用泛型工廠函數(shù)(generic factory function),它可以像adapt()一樣返回帶有多個(gè)方法的對(duì)象。泛型函數(shù)在“單點(diǎn)”protocol(常見)--一個(gè)方法只有一個(gè)馬上調(diào)用就可以獲得想要的結(jié)果接口--的情況下占優(yōu)勢(shì)。在使用配接時(shí),這可能要求每個(gè)配接器使用一種單一方法的輔助類(helper class),輔助類(helper class)來完成預(yù)期的運(yùn)行。在使用泛型函數(shù)時(shí),泛型函數(shù)則可以完成運(yùn)行。我們還沒有在多個(gè)參數(shù)上使用過泛型函數(shù)分派。
list()函數(shù)是python的內(nèi)置函數(shù)。
它可以將任何可迭代數(shù)據(jù)轉(zhuǎn)換為列表類型,并返回轉(zhuǎn)換后的列表。當(dāng)參數(shù)為空時(shí),list函數(shù)可以創(chuàng)建一個(gè)空列表。
它是一個(gè)計(jì)算機(jī)專業(yè)術(shù)語,在編程語言中List是類庫中的一個(gè)類,可以簡(jiǎn)單視之雙向連結(jié)串行,以線性列的方式管理物件集合。list也是操作系統(tǒng)的一個(gè)命令名稱。list的特色是在集合的任何位置增加或者刪除元素都很快,但是不支持隨機(jī)存取。list是類庫提供的眾多容器(container)之一,除此之外還有vector,set,map等等,list以模仿方式實(shí)現(xiàn)(即泛型),可以處理任意型別的變量,包括使用者自定義的資料形態(tài)。
在python中,list index out of range意思是列表的索引分配超出列范圍。
對(duì)于有序序列: 字符串 str 、列表 list 、元組 tuple進(jìn)行按索引取值的時(shí)候,默認(rèn)范圍為 0 ~ len(有序序列)-1,計(jì)數(shù)從0開始,而不是從1開始,最后一位索引則為總長(zhǎng)度減去1。
當(dāng)然也可以使用負(fù)數(shù)表示從倒數(shù)第幾個(gè),計(jì)數(shù)從-1開始,則對(duì)于有序序列,總體范圍為 -len(有序序列) ~ len(有序序列)-1,如果輸入的取值結(jié)果不在這個(gè)范圍內(nèi),則報(bào)這個(gè)錯(cuò)。
解決辦法:檢查索引是否在?-len(有序序列) ~ len(有序序列)-1?范圍內(nèi),修改正確。如下圖,len(a)=2,則對(duì)于有序序列,總體范圍為 0~ 1。
擴(kuò)展資料:
在Python編程語言中List 是標(biāo)準(zhǔn)類庫中的一個(gè)類,可以簡(jiǎn)單視之為雙向鏈表,以線性列的方式管理物件集合。
list 的特色是在集合的任何位置增加或刪除元素都很快,但是不支持隨機(jī)存取。list 是類庫提供的眾多容器(container)之一,除此之外還有vector、set、map、…等等。
list() 方法用于將元組轉(zhuǎn)換為列表。注:元組與列表是非常類似的,區(qū)別在于元組的元素值不能修改,元組是放在括號(hào)中,列表是放于方括號(hào)中。
list 以模板方式實(shí)現(xiàn)(即泛型),可以處理任意型別的變量,包括使用者自定義的資料型態(tài)例如:它可以是一個(gè)放置整數(shù)(int)型態(tài)的 list、也可以是放置字串(char 或 string)型態(tài)的 list、或者放置使用者自定類別(user-defined class)的 list。
參考資料:百度百科——python
標(biāo)題名稱:包含python實(shí)現(xiàn)泛型函數(shù)的詞條
瀏覽地址:http://www.chinadenli.net/article8/docceop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、、服務(wù)器托管、響應(yīng)式網(wǎng)站、品牌網(wǎng)站建設(shè)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)