迭代1. 什么是迭代? 使用for循環(huán)遍歷取值的過程叫做迭代,比如:使用for循環(huán)遍歷列表獲取值的過程 2. 可迭代對象 使用for循環(huán)遍歷取值的對象叫做可迭代對象, 比如:列表、元組、字典、集合、range、字符串 3.如何判斷一個對象是否可以迭代 可以使用isinstance()判斷一個對象是否是可迭代對象 Python 迭代器上面簡單的介紹了一下迭代,迭代是 Python 最強大的功能之一,是訪問集合元素的一種方式?,F(xiàn)在正式進入主題:迭代器,迭代器是一個可以記住遍歷的位置的對象。 迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。 迭代器只能往前不會后退。 迭代器有兩個基本的方法:iter() 和 next(),且字符串,列表或元組對象都可用于創(chuàng)建迭代器,迭代器對象可以使用常規(guī) for 語句進行遍歷,也可以使用 next() 函數(shù)來遍歷。 具體的實例: iter()函數(shù)與next()函數(shù) list、tuple等都是可迭代對象,我們可以通過iter()函數(shù)獲取這些可迭代對象的迭代器。然后我們可以對獲取到的迭代器不斷使用next()函數(shù)來獲取下一條數(shù)據(jù)。iter()函數(shù)實際上就是調(diào)用了可迭代對象的 __iter__ 方法。 注意,當我們已經(jīng)迭代完最后一個數(shù)據(jù)之后,再次調(diào)用next()函數(shù)會拋出StopIteration的異常,來告訴我們所有數(shù)據(jù)都已迭代完成,不能再執(zhí)行next()函數(shù)了。 lsit 生成式(列表生成式)1、創(chuàng)建 list 的方式 之前經(jīng)過我們的學習,都知道如何創(chuàng)建一個 list ,可是有些情況,用賦值的形式創(chuàng)建一個 list 太麻煩了,特別是有規(guī)律的 list ,一個一個的寫,一個一個賦值,太麻煩了。比如要生成一個有 30 個元素的 list ,里面的元素為 1 - 30 。我們可以這樣寫: 輸出的結果: 這個其實在之前也有提到過:比如有個例子,打印九九乘法表,用這個方法其實就幾句代碼就可以了,可以參考小編上一篇文章:循環(huán)語句的運用 但是,如果用到 list 生成式,可以一句代碼就生成九九乘法表了。具體看代碼: 最后輸出的結果: 不過,這里我們先要了解如何創(chuàng)建 list 生成式 2、list 生成式的創(chuàng)建 首先,lsit 生成式的語法為: 第一種語法:首先迭代 iterable 里所有內(nèi)容,每一次迭代,都把 iterable 里相應內(nèi)容放到iter_var 中,再在表達式中應用該 iter_var 的內(nèi)容,最后用表達式的計算值生成一個列表。 第二種語法:加入了判斷語句,只有滿足條件的內(nèi)容才把 iterable 里相應內(nèi)容放到 iter_var 中,再在表達式中應用該 iter_var 的內(nèi)容,最后用表達式的計算值生成一個列表。 其實不難理解的,因為是 list 生成式,因此肯定是用 [] 括起來的,然后里面的語句是把要生成的元素放在前面,后面加 for 循環(huán)語句或者 for 循環(huán)語句和判斷語句。 例子: 輸出的結果: 可以看到,就是把要生成的元素x * x放到前面,后面跟 for 循環(huán),就可以把 list 創(chuàng)建出來。那么 for 循環(huán)后面有 if 的形式呢?又該如何理解: 輸出的結果: 這個例子是為了求 1 到 10 中偶數(shù)的平方根,上面也說到,x * x是要生成的元素,后面那部分其實就是在 for 循環(huán)中嵌套了一個 if 判斷語句。 那么有了這個知識點,我們也可以猜想出,for 循環(huán)里面也嵌套 for 循環(huán)。具體示例: 輸出的結果: 其實知道了 list 生成式是怎樣組合的,就不難理解這個東西了。因為 list 生成式只是把之前學習的知識點進行了組合,換成了一種更簡潔的寫法而已。 生成器利用迭代器,我們可以在每次迭代獲取數(shù)據(jù)(通過next()方法)時按照特定的規(guī)律進行生成。但是我們在實現(xiàn)一個迭代器時,關于當前迭代到的狀態(tài)需要我們自己記錄,進而才能根據(jù)當前狀態(tài)生成下一個數(shù)據(jù)。為了達到記錄當前狀態(tài),并配合next()函數(shù)進行迭代使用,我們可以采用更簡便的語法,即生成器(generator)。生成器是一類特殊的迭代器。 創(chuàng)建生成器的方法1 要創(chuàng)建一個生成器,有很多種方法。第一種?法很簡單,只要把一個列表生成式的 [ ] 改成 ( ) 創(chuàng)建 L 和 G 的區(qū)別僅在于最外層的 [ ] 和 ( ) , L 是一個列表,而 G 是一個生成器。我們可以直接打印出列表L的每一個元素,而對于生成器G,我們可以按照迭代器的使用方法來使用,即可以通過next()函數(shù)、for循環(huán)、list()等方法使用。 創(chuàng)建生成器的方法2 generator?常強大。如果推算的算法比較復雜,用類似列表生成式的 for 循環(huán)無法實現(xiàn)的時候,還可以用函數(shù)來實現(xiàn)。 我們用著名的斐波那契數(shù)列來舉例,回想我們在上一次?迭代器的實現(xiàn)方式: 注意,在用迭代器實現(xiàn)的方式中,我們要借助幾個變量(n、current、num1、num2)來保存迭代的狀態(tài)?,F(xiàn)在我們用生成器來實現(xiàn)一下。 迭代器和生成器綜合例子因為迭代器和生成器基本是互通的,因此有些知識點需要綜合在一起 1、反向迭代 反向迭代,也是常有的需求了,比如從一開始迭代的例子里,有個輸出 list 的元素,從 1 到 5 的 那么我們從 5 到 1 呢?這也很簡單, Python 中有內(nèi)置的函數(shù) reversed() 方向迭代很簡單,可是要注意一點就是:反向迭代僅僅當對象的大小可預先確定或者對象實現(xiàn)了 __reversed__() 的特殊方法時才能生效。 如果兩者都不符合,那你必須先將對象轉換為一個列表才行 其實很多時候我們可以通過在自定義類上實現(xiàn) __reversed__()方法來實現(xiàn)反向迭代。不過有些知識點在之前的篇節(jié)中還沒有提到,不過可以相應的看下,有編程基礎的,學完上面的知識點應該也能理解的。 輸出的結果是 1 到 30 然后 30 到 1 ,分別是順序打印和倒序打印 2、同時迭代多個序列 你想同時迭代多個序列,每次分別從一個序列中取一個元素。你遇到過這樣的需求嗎? 為了同時迭代多個序列,使用 zip() 函數(shù),具體示例: 輸出的結果: 其實 zip(a, b) 會生成一個可返回元組 (x, y) 的迭代器,其中 x 來自 a,y 來自 b。 一旦其中某個序列到底結尾,迭代宣告結束。 因此迭代長度跟參數(shù)中最短序列長度一致。注意理解這句話喔,也就是說如果 a , b 的長度不一致的話,以最短的為標準,遍歷完后就結束。 利用 zip() 函數(shù),我們還可把一個 key 列表和一個 value 列表生成一個 dict (字典),如下: 輸出的結果: 這里提一下,zip()是可以接受多于兩個的序列的參數(shù),不僅僅是兩個。 |
|