中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

python迭代器和生成器有什么區(qū)別-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!

創(chuàng)新互聯(lián)公司是一家專業(yè)從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計(jì)公司,作為專業(yè)的成都網(wǎng)站建設(shè)公司,創(chuàng)新互聯(lián)公司依托強(qiáng)大的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計(jì)開發(fā)服務(wù)!

小編給大家分享一下python迭代器和生成器有什么區(qū)別,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

迭代

1. 什么是迭代?

使用for循環(huán)遍歷取值的過程叫做迭代,比如:使用for循環(huán)遍歷列表獲取值的過程

python迭代器和生成器有什么區(qū)別

2. 可迭代對象

使用for循環(huán)遍歷取值的對象叫做可迭代對象, 比如:列表、元組、字典、集合、range、字符串

3.如何判斷一個(gè)對象是否可以迭代

可以使用isinstance()判斷一個(gè)對象是否是可迭代對象

python迭代器和生成器有什么區(qū)別

Python 迭代器

上面簡單的介紹了一下迭代,迭代是 Python 最強(qiáng)大的功能之一,是訪問集合元素的一種方式。現(xiàn)在正式進(jìn)入主題:迭代器,迭代器是一個(gè)可以記住遍歷的位置的對象。

迭代器對象從集合的第一個(gè)元素開始訪問,直到所有的元素被訪問完結(jié)束。

迭代器只能往前不會后退。

迭代器有兩個(gè)基本的方法:iter() 和 next(),且字符串,列表或元組對象都可用于創(chuàng)建迭代器,迭代器對象可以使用常規(guī) for 語句進(jìn)行遍歷,也可以使用 next() 函數(shù)來遍歷。

具體的實(shí)例:

python迭代器和生成器有什么區(qū)別

iter()函數(shù)與next()函數(shù)

list、tuple等都是可迭代對象,我們可以通過iter()函數(shù)獲取這些可迭代對象的迭代器。然后我們可以對獲取到的迭代器不斷使用next()函數(shù)來獲取下一條數(shù)據(jù)。iter()函數(shù)實(shí)際上就是調(diào)用了可迭代對象的 __iter__ 方法。

python迭代器和生成器有什么區(qū)別

注意,當(dāng)我們已經(jīng)迭代完最后一個(gè)數(shù)據(jù)之后,再次調(diào)用next()函數(shù)會拋出StopIteration的異常,來告訴我們所有數(shù)據(jù)都已迭代完成,不能再執(zhí)行next()函數(shù)了。

lsit 生成式(列表生成式)

1、創(chuàng)建 list 的方式

之前經(jīng)過我們的學(xué)習(xí),都知道如何創(chuàng)建一個(gè) list ,可是有些情況,用賦值的形式創(chuàng)建一個(gè) list 太麻煩了,特別是有規(guī)律的 list ,一個(gè)一個(gè)的寫,一個(gè)一個(gè)賦值,太麻煩了。比如要生成一個(gè)有 30 個(gè)元素的 list ,里面的元素為 1 - 30 。我們可以這樣寫:

python迭代器和生成器有什么區(qū)別

輸出的結(jié)果:

python迭代器和生成器有什么區(qū)別

這個(gè)其實(shí)在之前也有提到過:比如有個(gè)例子,打印九九乘法表,用這個(gè)方法其實(shí)就幾句代碼就可以了,可以參考之前文章:循環(huán)語句的運(yùn)用

但是,如果用到 list 生成式,可以一句代碼就生成九九乘法表了。具體看代碼:

python迭代器和生成器有什么區(qū)別

最后輸出的結(jié)果:

python迭代器和生成器有什么區(qū)別

不過,這里我們先要了解如何創(chuàng)建 list 生成式

2、list 生成式的創(chuàng)建

首先,lsit 生成式的語法為:

python迭代器和生成器有什么區(qū)別

第一種語法:首先迭代 iterable 里所有內(nèi)容,每一次迭代,都把 iterable 里相應(yīng)內(nèi)容放到iter_var 中,再在表達(dá)式中應(yīng)用該 iter_var 的內(nèi)容,最后用表達(dá)式的計(jì)算值生成一個(gè)列表。

第二種語法:加入了判斷語句,只有滿足條件的內(nèi)容才把 iterable 里相應(yīng)內(nèi)容放到 iter_var 中,再在表達(dá)式中應(yīng)用該 iter_var 的內(nèi)容,最后用表達(dá)式的計(jì)算值生成一個(gè)列表。

其實(shí)不難理解的,因?yàn)槭?list 生成式,因此肯定是用 [] 括起來的,然后里面的語句是把要生成的元素放在前面,后面加 for 循環(huán)語句或者 for 循環(huán)語句和判斷語句。

例子:

python迭代器和生成器有什么區(qū)別

輸出的結(jié)果:

python迭代器和生成器有什么區(qū)別

可以看到,就是把要生成的元素 x * x 放到前面,后面跟 for 循環(huán),就可以把 list 創(chuàng)建出來。那么 for 循環(huán)后面有 if 的形式呢?又該如何理解:

python迭代器和生成器有什么區(qū)別

輸出的結(jié)果:

python迭代器和生成器有什么區(qū)別

這個(gè)例子是為了求 1 到 10 中偶數(shù)的平方根,上面也說到, x * x 是要生成的元素,后面那部分其實(shí)就是在 for 循環(huán)中嵌套了一個(gè) if 判斷語句。

那么有了這個(gè)知識點(diǎn),我們也可以猜想出,for 循環(huán)里面也嵌套 for 循環(huán)。具體示例:

python迭代器和生成器有什么區(qū)別

輸出的結(jié)果:

python迭代器和生成器有什么區(qū)別

其實(shí)知道了 list 生成式是怎樣組合的,就不難理解這個(gè)東西了。因?yàn)?list 生成式只是把之前學(xué)習(xí)的知識點(diǎn)進(jìn)行了組合,換成了一種更簡潔的寫法而已。

生成器

利用迭代器,我們可以在每次迭代獲取數(shù)據(jù)(通過next()方法)時(shí)按照特定的規(guī)律進(jìn)行生成。但是我們在實(shí)現(xiàn)一個(gè)迭代器時(shí),關(guān)于當(dāng)前迭代到的狀態(tài)需要我們自己記錄,進(jìn)而才能根據(jù)當(dāng)前狀態(tài)生成下一個(gè)數(shù)據(jù)。為了達(dá)到記錄當(dāng)前狀態(tài),并配合next()函數(shù)進(jìn)行迭代使用,我們可以采用更簡便的語法,即生成器(generator)。生成器是一類特殊的迭代器。

創(chuàng)建生成器的方法1

要?jiǎng)?chuàng)建一個(gè)生成器,有很多種方法。第一種?法很簡單,只要把一個(gè)列表生成式的 [ ] 改成 ( )

python迭代器和生成器有什么區(qū)別

創(chuàng)建 L 和 G 的區(qū)別僅在于最外層的 [ ] 和 ( ) , L 是一個(gè)列表,而 G 是一個(gè)生成器。我們可以直接打印出列表L的每一個(gè)元素,而對于生成器G,我們可以按照迭代器的使用方法來使用,即可以通過next()函數(shù)、for循環(huán)、list()等方法使用。

python迭代器和生成器有什么區(qū)別

創(chuàng)建生成器的方法2

generator?常強(qiáng)大。如果推算的算法比較復(fù)雜,用類似列表生成式的 for 循環(huán)無法實(shí)現(xiàn)的時(shí)候,還可以用函數(shù)來實(shí)現(xiàn)。 我們用著名的斐波那契數(shù)列來舉例,回想我們在上一次?迭代器的實(shí)現(xiàn)方式:

python迭代器和生成器有什么區(qū)別

注意,在用迭代器實(shí)現(xiàn)的方式中,我們要借助幾個(gè)變量(n、current、num1、num2)來保存迭代的狀態(tài)。現(xiàn)在我們用生成器來實(shí)現(xiàn)一下。

python迭代器和生成器有什么區(qū)別

迭代器和生成器綜合例子

因?yàn)榈骱蜕善骰臼腔ネǖ?,因此有些知識點(diǎn)需要綜合在一起

1、反向迭代

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

python迭代器和生成器有什么區(qū)別

那么我們從 5 到 1 呢?這也很簡單, Python 中有內(nèi)置的函數(shù) reversed()

python迭代器和生成器有什么區(qū)別

方向迭代很簡單,可是要注意一點(diǎn)就是:反向迭代僅僅當(dāng)對象的大小可預(yù)先確定或者對象實(shí)現(xiàn)了 __reversed__() 的特殊方法時(shí)才能生效。 如果兩者都不符合,那你必須先將對象轉(zhuǎn)換為一個(gè)列表才行

其實(shí)很多時(shí)候我們可以通過在自定義類上實(shí)現(xiàn) __reversed__() 方法來實(shí)現(xiàn)反向迭代。不過有些知識點(diǎn)在之前的篇節(jié)中還沒有提到,不過可以相應(yīng)的看下,有編程基礎(chǔ)的,學(xué)完上面的知識點(diǎn)應(yīng)該也能理解的。

python迭代器和生成器有什么區(qū)別

輸出的結(jié)果是 1 到 30 然后 30 到 1 ,分別是順序打印和倒序打印

2、同時(shí)迭代多個(gè)序列

你想同時(shí)迭代多個(gè)序列,每次分別從一個(gè)序列中取一個(gè)元素。你遇到過這樣的需求嗎?

為了同時(shí)迭代多個(gè)序列,使用 zip() 函數(shù),具體示例:

python迭代器和生成器有什么區(qū)別

輸出的結(jié)果:

python迭代器和生成器有什么區(qū)別

其實(shí) zip(a, b) 會生成一個(gè)可返回元組 (x, y) 的迭代器,其中 x 來自 a,y 來自 b。 一旦其中某個(gè)序列到底結(jié)尾,迭代宣告結(jié)束。 因此迭代長度跟參數(shù)中最短序列長度一致。注意理解這句話喔,也就是說如果 a , b 的長度不一致的話,以最短的為標(biāo)準(zhǔn),遍歷完后就結(jié)束。

利用 zip() 函數(shù),我們還可把一個(gè) key 列表和一個(gè) value 列表生成一個(gè) dict (字典),如下:

python迭代器和生成器有什么區(qū)別

輸出的結(jié)果:

python迭代器和生成器有什么區(qū)別

這里提一下, zip() 是可以接受多于兩個(gè)的序列的參數(shù),不僅僅是兩個(gè)。

看完了這篇文章,相信你對python迭代器和生成器有什么區(qū)別有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!

當(dāng)前題目:python迭代器和生成器有什么區(qū)別-創(chuàng)新互聯(lián)
文章路徑:http://www.rwnh.cn/article40/dghieo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、微信小程序虛擬主機(jī)、網(wǎng)站策劃App設(shè)計(jì)、網(wǎng)站內(nèi)鏈

廣告

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

成都網(wǎng)頁設(shè)計(jì)公司
明水县| 靖江市| 肇州县| 中卫市| 噶尔县| 霍林郭勒市| 绩溪县| 石楼县| 商丘市| 雷波县| 广安市| 定陶县| 巴塘县| 沂水县| 巴青县| 英吉沙县| 藁城市| 枣强县| 启东市| 镇坪县| 旺苍县| 靖州| 呼图壁县| 洛隆县| 柳江县| 紫金县| 六盘水市| 石泉县| 文水县| 喀喇沁旗| 伊金霍洛旗| 浦北县| 秭归县| 山阳县| 金沙县| 兴安县| 宁海县| 太原市| 石门县| 青浦区| 长垣县|