創(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)遍歷列表獲取值的過程
2. 可迭代對象
使用for循環(huán)遍歷取值的對象叫做可迭代對象, 比如:列表、元組、字典、集合、range、字符串
3.如何判斷一個(gè)對象是否可以迭代
可以使用isinstance()判斷一個(gè)對象是否是可迭代對象
Python 迭代器
上面簡單的介紹了一下迭代,迭代是 Python 最強(qiáng)大的功能之一,是訪問集合元素的一種方式。現(xiàn)在正式進(jìn)入主題:迭代器,迭代器是一個(gè)可以記住遍歷的位置的對象。
迭代器對象從集合的第一個(gè)元素開始訪問,直到所有的元素被訪問完結(jié)束。
迭代器只能往前不會后退。
迭代器有兩個(gè)基本的方法:iter() 和 next(),且字符串,列表或元組對象都可用于創(chuàng)建迭代器,迭代器對象可以使用常規(guī) for 語句進(jìn)行遍歷,也可以使用 next() 函數(shù)來遍歷。
具體的實(shí)例:
iter()函數(shù)與next()函數(shù)
list、tuple等都是可迭代對象,我們可以通過iter()函數(shù)獲取這些可迭代對象的迭代器。然后我們可以對獲取到的迭代器不斷使用next()函數(shù)來獲取下一條數(shù)據(jù)。iter()函數(shù)實(shí)際上就是調(diào)用了可迭代對象的 __iter__ 方法。
注意,當(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 。我們可以這樣寫:
輸出的結(jié)果:
這個(gè)其實(shí)在之前也有提到過:比如有個(gè)例子,打印九九乘法表,用這個(gè)方法其實(shí)就幾句代碼就可以了,可以參考之前文章:循環(huán)語句的運(yùn)用
但是,如果用到 list 生成式,可以一句代碼就生成九九乘法表了。具體看代碼:
最后輸出的結(jié)果:
不過,這里我們先要了解如何創(chuàng)建 list 生成式
2、list 生成式的創(chuàng)建
首先,lsit 生成式的語法為:
第一種語法:首先迭代 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)語句和判斷語句。
例子:
輸出的結(jié)果:
可以看到,就是把要生成的元素 x * x 放到前面,后面跟 for 循環(huán),就可以把 list 創(chuàng)建出來。那么 for 循環(huán)后面有 if 的形式呢?又該如何理解:
輸出的結(jié)果:
這個(gè)例子是為了求 1 到 10 中偶數(shù)的平方根,上面也說到, x * x 是要生成的元素,后面那部分其實(shí)就是在 for 循環(huán)中嵌套了一個(gè) if 判斷語句。
那么有了這個(gè)知識點(diǎn),我們也可以猜想出,for 循環(huán)里面也嵌套 for 循環(huán)。具體示例:
輸出的結(jié)果:
其實(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è)列表生成式的 [ ] 改成 ( )
創(chuàng)建 L 和 G 的區(qū)別僅在于最外層的 [ ] 和 ( ) , L 是一個(gè)列表,而 G 是一個(gè)生成器。我們可以直接打印出列表L的每一個(gè)元素,而對于生成器G,我們可以按照迭代器的使用方法來使用,即可以通過next()函數(shù)、for循環(huán)、list()等方法使用。
創(chuàng)建生成器的方法2
generator?常強(qiáng)大。如果推算的算法比較復(fù)雜,用類似列表生成式的 for 循環(huán)無法實(shí)現(xiàn)的時(shí)候,還可以用函數(shù)來實(shí)現(xiàn)。 我們用著名的斐波那契數(shù)列來舉例,回想我們在上一次?迭代器的實(shí)現(xiàn)方式:
注意,在用迭代器實(shí)現(xiàn)的方式中,我們要借助幾個(gè)變量(n、current、num1、num2)來保存迭代的狀態(tài)。現(xiàn)在我們用生成器來實(shí)現(xiàn)一下。
迭代器和生成器綜合例子
因?yàn)榈骱蜕善骰臼腔ネǖ?,因此有些知識點(diǎn)需要綜合在一起
1、反向迭代
反向迭代,也是常有的需求了,比如從一開始迭代的例子里,有個(gè)輸出 list 的元素,從 1 到 5 的
那么我們從 5 到 1 呢?這也很簡單, Python 中有內(nèi)置的函數(shù) reversed()
方向迭代很簡單,可是要注意一點(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)該也能理解的。
輸出的結(jié)果是 1 到 30 然后 30 到 1 ,分別是順序打印和倒序打印
2、同時(shí)迭代多個(gè)序列
你想同時(shí)迭代多個(gè)序列,每次分別從一個(gè)序列中取一個(gè)元素。你遇到過這樣的需求嗎?
為了同時(shí)迭代多個(gè)序列,使用 zip() 函數(shù),具體示例:
輸出的結(jié)果:
其實(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 (字典),如下:
輸出的結(jié)果:
這里提一下, 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)
猜你還喜歡下面的內(nèi)容