久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

你知道Python迭代器和生成器的區(qū)別聯(lián)系嗎,?五分鐘帶你叱咤江湖

 bdpqlxz 2020-05-09


迭代

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ù)實際上就是調用了可迭代對象的 __iter__ 方法。

注意,,當我們已經(jīng)迭代完最后一個數(shù)據(jù)之后,,再次調用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 里所有內容,,每一次迭代,都把 iterable 里相應內容放到iter_var 中,,再在表達式中應用該 iter_var 的內容,,最后用表達式的計算值生成一個列表。

第二種語法:加入了判斷語句,,只有滿足條件的內容才把 iterable 里相應內容放到 iter_var 中,,再在表達式中應用該 iter_var 的內容,,最后用表達式的計算值生成一個列表。

其實不難理解的,,因為是 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)。現(xiàn)在我們用生成器來實現(xiàn)一下,。

迭代器和生成器綜合例子

因為迭代器和生成器基本是互通的,,因此有些知識點需要綜合在一起

1、反向迭代

反向迭代,,也是常有的需求了,,比如從一開始迭代的例子里,有個輸出 list 的元素,,從 1 到 5 的

那么我們從 5 到 1 呢,?這也很簡單, Python 中有內置的函數(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ù),,不僅僅是兩個,。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多