今天,咱們來爲你們介紹一下Python的進階知識——迭代器和生成器,大家知道是怎麼運行工做的嗎?python
迭代算法
1. 什麼是迭代?編程
使用for循環遍歷取值的過程叫作迭代,好比:使用for循環遍歷列表獲取值的過程網絡
2. 可迭代對象函數
使用for循環遍歷取值的對象叫作可迭代對象, 好比:列表、元組、字典、集合、range、字符串學習
3.如何判斷一個對象是否能夠迭代
另外注意:光理論是不夠的。這裏順便免費送你們一套2020最新python入門到高級項目實戰視頻教程,能夠去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下能夠找到了,還能夠跟老司機交流討教!spa
可使用isinstance()判斷一個對象是不是可迭代對象3d
Python 迭代器視頻
上面簡單的介紹了一下迭代,迭代是 Python 最強大的功能之一,是訪問集合元素的一種方式。如今正式進入主題:迭代器,迭代器是一個能夠記住遍歷的位置的對象。對象
迭代器對象從集合的第一個元素開始訪問,直到全部的元素被訪問完結束。
迭代器只能往前不會後退。
迭代器有兩個基本的方法:iter() 和 next(),且字符串,列表或元組對象均可用於建立迭代器,迭代器對象可使用常規 for 語句進行遍歷,也可使用 next() 函數來遍歷。
具體的實例:
iter()函數與next()函數
list、tuple等都是可迭代對象,咱們能夠經過iter()函數獲取這些可迭代對象的迭代器。而後咱們能夠對獲取到的迭代器不斷使用next()函數來獲取下一條數據。iter()函數實際上就是調用了可迭代對象的 __iter__ 方法。
注意,當咱們已經迭代完最後一個數據以後,再次調用next()函數會拋出StopIteration的異常,來告訴咱們全部數據都已迭代完成,不能再執行next()函數了。
lsit 生成式(列表生成式)
一、建立 list 的方式
以前通過咱們的學習,都知道如何建立一個 list ,但是有些狀況,用賦值的形式建立一個 list 太麻煩了,特別是有規律的 list ,一個一個的寫,一個一個賦值,太麻煩了。好比要生成一個有 30 個元素的 list ,裏面的元素爲 1 - 30 。咱們能夠這樣寫:
輸出的結果:
這個其實在以前也有提到過:好比有個例子,打印九九乘法表,用這個方法其實就幾句代碼就能夠了,能夠參考以前文章:循環語句的運用
可是,若是用到 list 生成式,能夠一句代碼就生成九九乘法表了。具體看代碼:
最後輸出的結果:
不過,這裏咱們先要了解如何建立 list 生成式
二、list 生成式的建立
首先,lsit 生成式的語法爲:
第一種語法:首先迭代 iterable 裏全部內容,每一次迭代,都把 iterable 裏相應內容放到iter_var 中,再在表達式中應用該 iter_var 的內容,最後用表達式的計算值生成一個列表。
第二種語法:加入了判斷語句,只有知足條件的內容才把 iterable 裏相應內容放到 iter_var 中,再在表達式中應用該 iter_var 的內容,最後用表達式的計算值生成一個列表。
其實不難理解的,由於是 list 生成式,所以確定是用 [] 括起來的,而後裏面的語句是把要生成的元素放在前面,後面加 for 循環語句或者 for 循環語句和判斷語句。
例子:
輸出的結果:
能夠看到,就是把要生成的元素 x * x 放到前面,後面跟 for 循環,就能夠把 list 建立出來。那麼 for 循環後面有 if 的形式呢?又該如何理解:
輸出的結果:
這個例子是爲了求 1 到 10 中偶數的平方根,上面也說到, x * x 是要生成的元素,後面那部分其實就是在 for 循環中嵌套了一個 if 判斷語句。
那麼有了這個知識點,咱們也能夠猜測出,for 循環裏面也嵌套 for 循環。具體示例:
輸出的結果:
其實知道了 list 生成式是怎樣組合的,就不難理解這個東西了。由於 list 生成式只是把以前學習的知識點進行了組合,換成了一種更簡潔的寫法而已。
生成器
利用迭代器,咱們能夠在每次迭代獲取數據(經過next()方法)時按照特定的規律進行生成。可是咱們在實現一個迭代器時,關於當前迭代到的狀態須要咱們本身記錄,進而才能根據當前狀態生成下一個數據。爲了達到記錄當前狀態,並配合next()函數進行迭代使用,咱們能夠採用更簡便的語法,即生成器(generator)。生成器是一類特殊的迭代器。
建立生成器的方法1
要建立一個生成器,有不少種方法。第一種⽅法很簡單,只要把一個列表生成式的 [ ] 改爲 ( )
建立 L 和 G 的區別僅在於最外層的 [ ] 和 ( ) , L 是一個列表,而 G 是一個生成器。咱們能夠直接打印出列表L的每個元素,而對於生成器G,咱們能夠按照迭代器的使用方法來使用,便可以經過next()函數、for循環、list()等方法使用。
建立生成器的方法2
generator⾮常強大。若是推算的算法比較複雜,用相似列表生成式的 for 循環沒法實現的時候,還能夠用函數來實現。 咱們用著名的斐波那契數列來舉例,回想咱們在上一次⽤迭代器的實現方式:
注意,在用迭代器實現的方式中,咱們要藉助幾個變量(n、current、num一、num2)來保存迭代的狀態。如今咱們用生成器來實現一下。
迭代器和生成器綜合例子
由於迭代器和生成器基本是互通的,所以有些知識點須要綜合在一塊兒
一、反向迭代
反向迭代,也是常有的需求了,好比從一開始迭代的例子裏,有個輸出 list 的元素,從 1 到 5 的
那麼咱們從 5 到 1 呢?這也很簡單, Python 中有內置的函數 reversed()
方向迭代很簡單,但是要注意一點就是:反向迭代僅僅當對象的大小可預先肯定或者對象實現了 __reversed__() 的特殊方法時才能生效。 若是二者都不符合,那你必須先將對象轉換爲一個列表才行
其實不少時候咱們能夠經過在自定義類上實現 __reversed__() 方法來實現反向迭代。不過有些知識點在以前的篇節中尚未提到,不過能夠相應的看下,有編程基礎的,學完上面的知識點應該也能理解的。
輸出的結果是 1 到 30 而後 30 到 1 ,分別是順序打印和倒序打印
二、同時迭代多個序列
你想同時迭代多個序列,每次分別從一個序列中取一個元素。你遇到過這樣的需求嗎?
爲了同時迭代多個序列,使用 zip() 函數,具體示例:
輸出的結果:
其實 zip(a, b) 會生成一個可返回元組 (x, y) 的迭代器,其中 x 來自 a,y 來自 b。 一旦其中某個序列到底結尾,迭代宣告結束。 所以迭代長度跟參數中最短序列長度一致。注意理解這句話喔,也就是說若是 a , b 的長度不一致的話,以最短的爲標準,遍歷完後就結束。
利用 zip() 函數,咱們還可把一個 key 列表和一個 value 列表生成一個 dict (字典),以下:
輸出的結果:
這裏提一下, zip() 是能夠接受多於兩個的序列的參數,不只僅是兩個。
最後注意:光理論是不夠的。這裏順便免費送你們一套2020最新python入門到高級項目實戰視頻教程,能夠去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下能夠找到了,還能夠跟老司機交流討教!
本文的文字及圖片來源於網絡加上本身的想法,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。