python基礎教程(十一)

?

迭代器

?

本節進行迭代器的討論。只討論一個特殊方法----?__iter__??,這個方法是迭代器規則的基礎。

?

迭代器規則

迭代的意思是重復做一些事很多次---就像在循環中做的那樣。__iter__?方法返回一個迭代器,所謂迭代器就是具有next方法的對象,在調用next方法時,迭代器會返回它的下一個值。如果next方法被調用,但迭代器沒有值可以返回,就會引發一個StopIteration異常。

?

這里是一個婓波那契數例,使用迭代器如下:

復制代碼
class Fibs:def __init__(self):self.a = 0 self.b = 1 def next(self): self.a , self.b = self.b , self.a + self.b return self.a def __iter__(self): return self >>> fibs = Fibs() >>> for f in fibs: if f > 1000: print f break #因為設置了break ,所以循環在這里停止。 1597
復制代碼

內建函數iter可以從可迭代的對象中獲得迭代器。

>>> it = iter([1,2,3])
>>> it.next()
1
>>> it.next()
2

?

從迭代器得到序列

除了在迭代器和可迭代對象上進行迭代外,還能把它們轉換為序列。在大部分能使用序列的情況下,能使用迭代器替換。

復制代碼
class TestIterator:value = 0def next(self):self.value += 1if self.value > 10: raise StopIteration return self.value def __iter__(self): return self >>> ti = TestIterator() >>> list(ti) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
復制代碼

 

?

 

生成器

?

生成器也叫?簡單生成器,生成器可以幫助讀者寫出非常優雅的代碼,當然,編寫任何程序時不使用生成器也是可以的。

?

創建生成器

創建一個生成器就像創建函數一樣簡單。

復制代碼
>>> def flatten(nested):for sublist in nested:for element in sublist: yield element >>> nested = [[1,2],[3,4],[5]] #使用for循環 >>> for num in flatten(nested): print num 1 2 3 4 5 #或使用list函數 >>> list(flatten(nested)) [1, 2, 3, 4, 5]
復制代碼

?

遞歸生成器

上面創建的生成器只能處理兩層嵌套,為了處理嵌套使用了兩個for循環,如果要處理任意層的嵌套呢?例如,可以每層嵌套需要增加一個for循環,但不知道有幾層嵌套,所以必須把解決方案變得更靈活,現在可以用遞歸來解決。

復制代碼
>>> def fla(aa):try:for bb in aa: for cc in fla(bb): yield cc except TypeError: yield aa >>> list(fla([[[1],2],3,4,[5,[6,7]],8])) #注意括號層次比較多 [1, 2, 3, 4, 5, 6, 7, 8]
復制代碼

  

fla被調用時有兩種情況:基本情況和需要遞歸的情況

  在基本的情況中,函數被告知展開一個元素,這種情部下,for循環會引發一個TypeError?異常,生成會產生一個元素。

  如果展開的是一個列表,那么就需要特殊情況處理。程序必須遍歷所有的子列表,并對它們調用fla

-------------------

上面的做法有一個問題:如果aa?是一個類似于字符串的對象(字符串、UnicodeUserString等),那么它就是一個序列,不會引發TypeError,但是你不想對這樣的對象進行迭代。

為了處理這種情況,則必須在生成器的開始處添加一個檢查語句。試著將傳入的對象和一個字符串拼接,看看會不會出現TypeError,這是檢查一個對象是不是類似于字符串最簡單快速的方法。

復制代碼
>>> def flatten(nested):try:#不要迭代類似字符串的對象 try:nested + '' except TypeError: pass else: raise TypeError for sublist in nested: for element in flatten(sublist): yield element except TypeError: yield nested >>> list(flatten(['foo',['bar',['baz']]])) ['foo', 'bar', 'baz']
復制代碼

如果nested+’’?引發了一個TypError?,它就會被忽略。如果沒有引發TypeError,那么內層try語句就會引發一個它自己的TypeError異常。

?

?

生成器方法

生成器新屬性是在開始運行后為生成器提供值的能力。表現為生成器和“外部世界”進行交流的渠道:

  *?外部作用域訪問生成器的send方法,就像訪問next?方法一樣,只不過前者使用一個參數(發送的“消息”---任意對象)

  *?在內部則掛起生成器,yield現在作為表達式而不是語句使用,換句話說,當生成器重新運行的時候,yield方法返回一個值,也就是外部通過send方法發送的值。如果next?方法被使用,那么yield方法返回None.?

下面簡單的方例子來說明這種機制:

復制代碼
>>> def repeater(value):while True:new =(yield value) if new is not None:value = new >>> r = repeater(42) >>> r.next() 42 >>> r.send("hello, world!") 'hello, world!'
復制代碼

生成器的另兩個方法:

  *?throw方法(使用異常類型調用,還有可選的值以及回溯對象)用于在生成器內引發一個異常(在yield表達式中)

  *?close?方法(調用時不用參數)用于停止生成器。

?

轉載于:https://www.cnblogs.com/cmt110/p/7464757.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391498.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391498.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391498.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

編程需要數學知識嗎_編程需要了解數學嗎?

編程需要數學知識嗎Does programming require knowing math? Not necessarily. 編程需要了解數學嗎? 不必要。 When I say that, Im mostly talking about Web Development, not working with graphics or specific applications that require advanced math. 當我…

美劇迷失_迷失(機器)翻譯

美劇迷失Machine translation doesn’t generate as much excitement as other emerging areas in NLP these days, in part because consumer-facing services like Google Translate have been around since April 2006.如今,機器翻譯并沒有像其他NLP新興領域那樣…

mysql 1449 : The user specified as a definer ('usertest'@'%') does not exist 解決方法 (grant 授予權限)...

從服務器上遷移數據庫到本地localhost 執行 函數 時報錯, mysql 1449 : The user specified as a definer (usertest%) does not exist 經查,是權限問題(其中usertest是服務器上數據庫的登錄名),解決辦法: 授權給 u…

初識數據結構與算法

1、什么是數據結構? a、數據結構是一門研究非數值計算的程序設計問題中的操作對象,以及它們之間的關系和操作等相關問題的學科。 b、數據結構是計算機存儲、組織數據的方式,數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常…

產品經理思考

1.分析QQ與微信的區別,包含其中存在的問題,并給出解決方案。 2.如果你設計一款基于音樂的高品質內容的社交軟件,給說出這么設計的原因。 3.請說出一款APP的的看法,指出其中不合理的地方,并說明原因(APP如果…

shopify 開發_播客第57集:從Shopify的作家到開發人員,與Adam Hollett一起

shopify 開發On this weeks episode of the freeCodeCamp podcast, Quincy interviews Adam Hollett. Hes a software developer at Shopify in Ottawa, Canada.在本周的freeCodeCamp播客節目中,Quincy采訪了Adam Hollett。 他是加拿大渥太華Shopify的軟件開發人員。…

機器學習中決策樹的隨機森林_決策樹和隨機森林在機器學習中的使用

機器學習中決策樹的隨機森林機器學習 (Machine Learning) Machine learning is an application of artificial intelligence that provides systems the ability to automatically learn and improve from experience without being explicitly programmed. The 3 main categor…

pycharm 快捷鍵

編輯: ctrl D   快速復制粘貼一行 ctrl E   快速刪除一行 ctrl Z   撤銷上一步命令或輸入 end  快速跳到行末 shift enter  快速換行(尤其適用于光標不在行末時) ctrl F  查找 ctrl R  替換 轉載于:https://www.cnblogs.com/Chris-0…

【Python算法】遍歷(Traversal)、深度優先(DFS)、廣度優先(BFS)

圖結構: 非常強大的結構化思維(或數學)模型。如果您能用圖的處理方式來規范化某個問題,即使這個問題本身看上去并不像個圖問題,也能使您離解決問題更進一步。 在眾多圖算法中,我們常會用到一種非常實用的思…

r語言編程基礎_這項免費的統計編程課程僅需2個小時即可學習R編程語言基礎知識

r語言編程基礎Learn the R programming language in this course from Barton Poulson of datalab.cc. This is a hands-on overview of the statistical programming language R, one of the most important tools in data science.從datalab.cc的 Barton Poulson學習本課程中…

leetcode 81. 搜索旋轉排序數組 II(二分查找)

已知存在一個按非降序排列的整數數組 nums &#xff0c;數組中的值不必互不相同。 在傳遞給函數之前&#xff0c;nums 在預先未知的某個下標 k&#xff08;0 < k < nums.length&#xff09;上進行了 旋轉 &#xff0c;使數組變為 [nums[k], nums[k1], …, nums[n-1], nu…

使用ViewContainerRef探索Angular DOM操作技術

每當我閱讀中遇到&#xff0c;關于Angular中使用DOM的內容時&#xff0c;總會看到一個或幾個這樣的類&#xff1a;ElementRef&#xff0c;TemplateRef&#xff0c;ViewContainerRef等等。 不幸的是&#xff0c;雖然其中的一些被Angular文檔或相關文章所講述&#xff0c;但是我還…

numpy1

1、NumPy包含的內容 1、ndarrray&#xff0c;高效的多維數組&#xff0c;提供了基于數組的便捷算術操作以及靈活的廣播功能&#xff1b; 2、對所有數組對象進行快速的矩陣計算&#xff0c;而無需編寫循環&#xff1b; 3、提供對硬盤中的數據的讀寫工具&#xff0c;并對內存映射…

我如何預測10場英超聯賽的確切結果

Is there a way to predict the outcome of any soccer game with 100% accuracy? The honest and simplest answer is…. no. Regardless of what your fantasy football friends say, there is absolutely no way to be 100% certain, but there is a proven, mathematical …

多迪技術總監揭秘:PHP為什么是世界上最好的語言?

PHP這么一個腳本語言&#xff0c;雖然他是web開發中&#xff0c;使用者最多的語言&#xff0c;最快最簡單的語言&#xff0c;生態環境和社區積累最深厚的語言&#xff0c;作為最好的編程語言&#xff0c;多迪技術總監為你介紹&#xff1a;PHP為什么是世界上最好的語言&#xff…

aws數據庫同步區別_了解如何通過使用AWS AppSync構建具有實時數據同步的應用程序

aws數據庫同步區別AWS AppSync automatically updates the data in web and mobile applications in real time, and updates data for offline users as soon as they reconnect. AWS AppSync會自動實時更新Web和移動應用程序中的數據&#xff0c;并在離線用戶重新連接后立即為…

leetcode 153. 尋找旋轉排序數組中的最小值(二分查找)

已知一個長度為 n 的數組&#xff0c;預先按照升序排列&#xff0c;經由 1 到 n 次 旋轉 后&#xff0c;得到輸入數組。例如&#xff0c;原數組 nums [0,1,2,4,5,6,7] 在變化后可能得到&#xff1a; 若旋轉 4 次&#xff0c;則可以得到 [4,5,6,7,0,1,2] 若旋轉 4 次&#xff0…

test1

test1 轉載于:https://www.cnblogs.com/Forever77/p/11434403.html

打印風車旋轉效果

1 while True: 2 for i in["/","-","\\","|"]: 3 print "%s\r" %i, 轉載于:https://www.cnblogs.com/feifei-cyj/p/7469333.html

深度學習數據自動編碼器_如何學習數據科學編碼

深度學習數據自動編碼器意見 (Opinion) When I first wanted to learn programming, I coded along to a 4 hour long YouTube tutorial.剛開始學習編程時&#xff0c;我編寫了長達4個小時的YouTube教程。 “Great,” I thought after finishing the course. “I know how to …