日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

代码流程图生成器_【进阶Python】第五讲:迭代器与生成器

發布時間:2023/12/3 python 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 代码流程图生成器_【进阶Python】第五讲:迭代器与生成器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊藍字關注我

迭代是Python中常用且非常強大的一個功能,它可以用于訪問集合、列表、字符串、字典等數據結構的元素。我們經常使用循環和條件語句,我們也清楚哪些是可以迭代訪問,但是具體它們之間有什么有什么異同之處?有哪些特點?什么是迭代器、什么是生成器、什么是可迭代對象?這些問題對于初學者而言卻是很少去細致的研究,本文就來詳細闡述一下它們之間的關系已經它們的特別之處。

—▼—

可迭代對象

在講解迭代器和生成器之前,先介紹一下可迭代對象。

可迭代對象是Python中一個非常龐大的概念,它主要包括如下三類:

  • 迭代器

  • 序列

  • 字典

從上圖可以看出不同概念之間的關系,迭代器是可迭代對象的一個子集,而生成器又是迭代器的一個子集,是一種特殊的迭代器。除了迭代器之外,Python中還有序列、字典等可迭代對象。

現在已經直觀的了解了可迭代對象與迭代器、生成器之間的關系,那么用Python語言怎么表述它們的區別呢?

  • 可迭代對象需要實現__iter__方法

  • 迭代器不僅要實現__iter__方法,還需要實現__next__方法

在使用層面,可迭代對象可以通過innot in訪問對象中的元素,舉一個例子,

X?=?set([1,2,3,4,5])print(X)print(type(X))print(1?in?X)print(2?not?in?X)for?x?in?X:????print(x)#?輸出{1,?2,?3,?4,?5}<class?'set'>TrueFalse
1
2
3
4
5

前面提到,可迭代對象實現了__iter__方法,但是它沒有實現__next__,這也是判定迭代器和其他可迭代對象的關鍵之處,可以看一下通過next訪問上述示例中可迭代對象X會報錯,

next(X)#?輸出TypeError:?'set'?object?is?not?an?iterator

報的錯誤是'set' object is not an iterator,它指明了set集合是一個可迭代對象,但不是迭代器,下面就來介紹一下迭代器。

迭代器

迭代器是可迭代對象的一個子集,它是一個可以記住遍歷的位置的對象,它與列表、元組、集合、字符串這些可迭代對象的區別就在于next方法的實現,其他列表、元組、集合、字符串這些可迭代對象可以很簡單的轉化成迭代器,通過Python內置的iter函數能夠輕松把可迭代對象轉化為迭代器,下面來看一個例子,

X?=?[1,2,3,4,5]print(type(X))Y?=?iter(X)print(type(Y))print(next(Y))print(next(Y))print(next(Y))#?輸出<class?'list'>
<class?'list_iterator'>
1
2
3

從上述示例中我們可以看出兩點:

  • 通過iter函數把list轉化成了迭代器

  • 可迭代器能夠記住遍歷位置,能夠通過next方法不斷從前往后訪問

除了Python內置的iter之外,還可以通過Python內置的工具包itertools創建迭代器,其中函數包括,

  • count

  • cycle

  • repeat

  • accumulate

  • chain

  • compress

  • dropwhile

  • islice

  • product

  • permutations

  • combinations

  • ……

itertools中包含很多用于創建迭代器的實用方法,如果感興趣嗯可以訪問官方文檔進行詳細了解。

當然,也可以自己通過實現__iter____next__方法來定義迭代器,

class?Iterator(object):????def?__init__(self,?array):????????self.x?=?array????????self.index?=?0????def?__iter__(self):????????return?self????def?__next__(self):????????if?self.index?????????????value?=?self.x[self.index]????????????self.index?+=?1????????else:????????????raise?StopIteration????????return?valueit?=?Iterator([1,2,3,4,5])print(type(it))for?i?in?it:????print(i)#?輸出<class?'__main__.Iterator'>
1
2
3
4
5

生成器

從文章開頭的流程圖可以直觀的看出,生成器是迭代器的子集,換句話說,生成器一定是迭代器,但是迭代器不全是生成器對象。

提及生成器就不得不提及一個Python中的關鍵字yiled,在Python中一個函數可以用yiled替代return返回值,這樣的話這個函數就變成了一個生成器對象,舉個例子對比一下,

def?generator(array):????for?i?in?array:????????return?igen?=?generator([1,2,3,4,5])print(type(gen))#?輸出<class?'int'>

這是我們常見的return返回方式,這樣的話generator函數獲取的是一個int型對象,下面看一下換成yield關鍵字,

def?generator(array):????for?i?in?array:????????yield(i)gen?=?generator([1,2,3,4,5])print(type(gen))#?輸出<class?'generator'>

這樣的話獲取的是一個生成器generator,除了yield之外,在Python3.3之后還加入了yield from獲取生成器,允許一個生成器將其部分操作委派給另一個生成器,使得生成器的用法變得更加簡潔,yield from后面需要加上可迭代對象,這樣可以把可迭代對象變成生成器,當然,這里的可迭代對象不僅包含列表、元組,還包含迭代器、生成器。yield from相對于yield的有幾個主要優點:

  • 代碼更加簡潔

  • 可以用于生成器嵌套

  • 易于異常處理

下面就從簡潔代碼方面舉個例子說明一下,

def?generator(array):????for?sub_array?in?array:????????yield?from?sub_arraygen?=?generator([(1,2,3),?(4,5,6,7)])#?輸出1234567

當我們需要訪問多層/多維可迭代對象時,我們就不需要逐層的去用for … in …去訪問,可以簡單的通過yiled from把生成器委派給子生成器,除此之外還可以通過生成器表達式的方法得到生成式,后面會介紹。

print(next(gen))print(next(gen))#?輸出12

通過上面示例可以看出,生成器可以像迭代器那樣使用iter和next方法。

讀到這里可以會有疑惑,從這個示例看來生成器和迭代器并沒有什么區別啊?為什么生成器還可以稱得上是Python中的一大亮點?

首先它對比于迭代器在編碼方面更加簡潔,這是顯而易見的,其次生成器運行速度更快,最后一點,也是需要著重說明的一點:節省內存。

也許在一些理論性實驗、學術論文階段可以不考慮這些工程化的問題,但是在公司做項目時,內存和資源占用是無法逃避的問題 。如果我們使用其他可迭代對象處理龐大的數據時,當創建或者返回值時會申請用于存儲整個可迭代對象的內存,顯然這是非常浪費的,因為有的元素當前我們用不到,也不會去訪問,但它卻一直占用這內存。這時候就體現了生成器的優點,它不是一次性把所有的結果都返回,而是當我們每讀取一次,它會返回一個結果,當我們不讀取時,它就是一個生成器表達式,幾乎不占用內存。

生成器表達式

首先來看一個對比示例,X?=?[1,?2,?3,?4,?5]it?=?[i?for?i?in?X]gen?=?(i?for?i?in?X)print(type(X))print(type(it))print(type(gen))#?輸出<class?'list'>
<class?'list'>
<class?'generator'>首先說一下it = [i for i in X],這種用法叫做列表生成式,在很多編程規范中非常推崇的一種替代for循環的方式,仔細看一下代碼會發現,it = [i for i in X]gen = (i for i in X)的區別非常小,只是一個用了中括號,一個用了小括號,但是它們的區別缺失非常大的,使用中括號的叫做列表生成式,獲得的返回值是一個列表,而使用小括號叫做生成器表達式,獲得的返回結果是一個生成器,這也是前面提到的,除了使用yield和yield from兩個關鍵字外還可以使用生成器表達式獲得生成器。

END

有趣的靈魂在等你

長按掃碼可關注?

相關文章【進階Python】第一講:開篇【進階Python】第二講:裝飾器【進階Python】第三講:類的特殊方法(上篇)【進階Python】第四講:類的特殊方法(下篇)文章好看就點這里

總結

以上是生活随笔為你收集整理的代码流程图生成器_【进阶Python】第五讲:迭代器与生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。