包含python實現(xiàn)泛型函數(shù)的詞條

各位有沒有詳細講Python泛型的資料

我們開始真正地討論Python3000了。這里有一個新的郵件列表和一個版本分支。首要的問題是關于流程的。Python 增強建議書(Python Enhancement Proposal,簡稱PEP)的很多新格式正在制定,目的是為了避免重蹈Perl 6的覆轍:-)。我在blog一個關于功能的提案,這個提案在過去一段時間里已經(jīng)發(fā)生了很大的變化)

創(chuàng)新互聯(lián)建站2013年至今,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都網(wǎng)站制作、成都網(wǎng)站設計網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元新寧做網(wǎng)站,已為上家服務,為新寧各地企業(yè)和個人服務,聯(lián)系電話:028-86922220

自盤古開天地之日起,Alex Martelli就一直是配接的忠實擁護者。他經(jīng)常埋怨我對配接的光芒視而不見。現(xiàn)在,我為自己當時的不開竅而感到慶幸。

我先用最簡單的形式來介紹一下配接吧。 這個想法誕生于一種常有的情況:需要用到對象包裝器(object wrapper)[貼切地命名為配接器模式(Adapter Pattern)]。PEP246打算提供一個內(nèi)置的函數(shù)adapt(X, P), X可以是任何對象,而P也可以是任何Protocol。我們故意不對protocol進行定義,只要它可以通過對象表現(xiàn)出來就可以。調(diào)用adapt(X, P)返回一個由X構建并滿足P的對象,如果創(chuàng)建對象失敗,則拋出一個異常。它使用全局注冊表(global registry)為配接器功能提供了類型和protocol之間的映射關系。我們可以寫為dict R = {(T, P): A, ...}。然后,adapt(X, P) 計算出adapter A = R[type(X), P],并返回A(X)。 還有一個注冊函數(shù)register(T, P, A),它簡單地設置 R[T, P] = A。請參見Alex更為精彩的解釋,他補充了很多我遺漏掉的東西。

當Alex提出他對配接工作原理的這一看法,好幾個人(包括我自己在內(nèi))都意識到全局注冊表是沒有必要的。每個protocol都可以有自己的注冊表(registry)。所以,現(xiàn)在我們在protocol上使用adapt()和register()方法。我們使用P.adapt(X)而非adapt(X, P),使用P.register(T, A)而非register(T, P, A)。A的簽名(signature)保持不變。我稱之為第二代配接(second-generation adaptation)。

這樣做的好處是你們再也不用局限于一種固定的全局的register()和adapt()實現(xiàn)。Alex提到了很多他忽略的問題,但是如果要真正實現(xiàn),這些問題需要得以解決。例如,如何處理對象類型未被注冊而一些基本類型已被注冊的配接,protocol之間的繼承是如何定義的(當你把protocol和接口等同起來時會很有用,就像Zope和Twisted一樣),對象已實現(xiàn)protocol/接口時的自動檢測(這在Zope和Twisted中有用)。一些擴展(extension)有在查找(lookup)的性能上有問題,我們可以通過幾種不同的方法來解決。通過多重協(xié)議實現(xiàn)(multiple protocol implementations)(每次都實現(xiàn)相同的adapt()和register() APIs),每個框架(framework)都對配接如何為其自身擁有的protocol服務有自己的主張,而沒必要使用一個固定的全局實現(xiàn)。對于一個特定的框架而言,配接的全局實現(xiàn)可能達到最佳效果,但也未必就是最好的選擇。

Ian Bicking提出了一個對立的觀點:我們?yōu)槭裁床皇褂梅盒秃瘮?shù)而非配接呢?他和Phillip Eby都認為泛型函數(shù)具有的功能比配接器更強大,至少在某種程度上差不多。現(xiàn)在我就來簡要說一下泛型函數(shù)。

一個泛型函數(shù)G,可以被調(diào)用,這種行為類似一個普通函數(shù)(取參數(shù)并返回一個值),但其實現(xiàn)是可擴展的(extensible),并可以在不同的模塊中進行定義。TG包含一個由復合類型參數(shù)的元組索引的注冊表實現(xiàn)。假設我們想讓具有兩個參數(shù)的G可調(diào)用,那么注冊表將會把成對了類型組(type pairs)映射到實現(xiàn)的函數(shù)中。我們可以使用G.register((T1, T2), F) 來顯示地定義,當type(X1)==T1、type(X2)==T2時,F(xiàn)(X1, X2)是G(X1, X2)的合適的實現(xiàn)。 最簡單的實現(xiàn)就是把參數(shù)映射到它們的類型(類或許更好),轉(zhuǎn)換為元組,并利用它作為注冊表的鍵值來找到實現(xiàn)函數(shù)。如果沒有找到健值,就調(diào)用缺省實現(xiàn),前提是預先定義G,并提供一些回調(diào)或拋出一個異常。

一個有用的泛型函數(shù)實現(xiàn)也必須支持在參數(shù)類型的基本類型上查找匹配。這就是使事情變得復雜的地方,特別是當你有多個參數(shù)時。例如,你有一個實現(xiàn)方案,它與第一個參數(shù)完全匹配,基本類型與第二個參數(shù)匹配;另一個實現(xiàn)方案是,它與第二個參數(shù)完全匹配,基本類型與第一個參數(shù)匹配。這種情況下,你會選擇哪一種?Phillip Eby的實現(xiàn)、RuleDispatch (part of PEAK) 拒絕做出猜測; 如果沒有占優(yōu)勢的實現(xiàn)方案(不管它是什么意思),都會拋出異常。你可以通過注冊一個更加具體的簽名來徹底解決問題。

C++用戶會認為泛型函數(shù)是一個C++編譯器用來解決函數(shù)重載問題的策略的運行時實現(xiàn)。幸運的是,我們不需要與C向后兼容,從而避免了重蹈C++的錯誤(如,導致浮點類型的優(yōu)先級高于布爾類型)。Lisp或 Dylan用戶(不知是否還存在:-),以及PyPy 開發(fā)者會認為它們是多重方法(multi-methods)。

為了對比上述兩種觀點,我提出了一個關于配接和泛型函數(shù)的一個簡單版本,通過這一版本來再現(xiàn)內(nèi)置iter()函數(shù)的重復實現(xiàn)。我在注冊表中使用了描述符,這使得簽名與我上面所述有一些輕微的差別,但實質(zhì)是一樣的。

勝負分曉了

現(xiàn)在我們已經(jīng)為慶祝時刻做好準備了。Tim Hochberg獨立開發(fā)的一個可以替代的Protocol版本給我們帶來了這一歡樂時刻。P.adapt(X)只是泛型函數(shù)G(x) 調(diào)用的另外一種冗長形式罷了。

有趣的是,Alex費了一些周折才開始喜歡上它。他過去一直認為配接的功能更強大,因為配接可以返回實現(xiàn)多個方法的對象,而泛型函數(shù)要實現(xiàn)同樣的功能則要求每個方法都有一個單獨的泛型函數(shù)。當然,我們可以使用泛型工廠函數(shù)(generic factory function),它可以像adapt()一樣返回帶有多個方法的對象。泛型函數(shù)在“單點”protocol(常見)--一個方法只有一個馬上調(diào)用就可以獲得想要的結果接口--的情況下占優(yōu)勢。在使用配接時,這可能要求每個配接器使用一種單一方法的輔助類(helper class),輔助類(helper class)來完成預期的運行。在使用泛型函數(shù)時,泛型函數(shù)則可以完成運行。我們還沒有在多個參數(shù)上使用過泛型函數(shù)分派。

python中brandlist函數(shù)作用

list()函數(shù)是python的內(nèi)置函數(shù)。

它可以將任何可迭代數(shù)據(jù)轉(zhuǎn)換為列表類型,并返回轉(zhuǎn)換后的列表。當參數(shù)為空時,list函數(shù)可以創(chuàng)建一個空列表。

它是一個計算機專業(yè)術語,在編程語言中List是類庫中的一個類,可以簡單視之雙向連結串行,以線性列的方式管理物件集合。list也是操作系統(tǒng)的一個命令名稱。list的特色是在集合的任何位置增加或者刪除元素都很快,但是不支持隨機存取。list是類庫提供的眾多容器(container)之一,除此之外還有vector,set,map等等,list以模仿方式實現(xiàn)(即泛型),可以處理任意型別的變量,包括使用者自定義的資料形態(tài)。

在python中, list index out of range是什么意思?

在python中,list index out of range意思是列表的索引分配超出列范圍。

對于有序序列: 字符串 str 、列表 list 、元組 tuple進行按索引取值的時候,默認范圍為 0 ~ len(有序序列)-1,計數(shù)從0開始,而不是從1開始,最后一位索引則為總長度減去1。

當然也可以使用負數(shù)表示從倒數(shù)第幾個,計數(shù)從-1開始,則對于有序序列,總體范圍為 -len(有序序列) ~ len(有序序列)-1,如果輸入的取值結果不在這個范圍內(nèi),則報這個錯。

解決辦法:檢查索引是否在?-len(有序序列) ~ len(有序序列)-1?范圍內(nèi),修改正確。如下圖,len(a)=2,則對于有序序列,總體范圍為 0~ 1。

擴展資料:

在Python編程語言中List 是標準類庫中的一個類,可以簡單視之為雙向鏈表,以線性列的方式管理物件集合。

list 的特色是在集合的任何位置增加或刪除元素都很快,但是不支持隨機存取。list 是類庫提供的眾多容器(container)之一,除此之外還有vector、set、map、…等等。

list() 方法用于將元組轉(zhuǎn)換為列表。注:元組與列表是非常類似的,區(qū)別在于元組的元素值不能修改,元組是放在括號中,列表是放于方括號中。

list 以模板方式實現(xiàn)(即泛型),可以處理任意型別的變量,包括使用者自定義的資料型態(tài)例如:它可以是一個放置整數(shù)(int)型態(tài)的 list、也可以是放置字串(char 或 string)型態(tài)的 list、或者放置使用者自定類別(user-defined class)的 list。

參考資料:百度百科——python

標題名稱:包含python實現(xiàn)泛型函數(shù)的詞條
瀏覽地址:http://muchs.cn/article8/docceop.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供關鍵詞優(yōu)化、服務器托管、響應式網(wǎng)站、品牌網(wǎng)站建設網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作