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

歡迎訪問 生活随笔!

生活随笔

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

python

python迭代器和生成器的作用_python迭代器与生成器的详细介绍

發布時間:2023/12/31 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python迭代器和生成器的作用_python迭代器与生成器的详细介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.什么玩意是迭代器?

先說說什么是迭代吧,迭代就是一件事情重復很多次,比如說for循環。

for循環可以對一切有iter方法的對象進行迭代,那么什么是iter方法呢?

一個對象是否可迭代,全都取決于這個對象是否有iter方法,調用對象的iter方法,就回返回一個迭代器,這個迭代器一定具有next方法,在調用這個迭代器的next方法時,迭代器就回返回它的下一個值,當迭代器中沒有值可以返回了,就回拋出一個名為StopIteration的異常,停止迭代。

迭代器還有個很重要的特性,就是不可逆,只能前進,不能后退。

for循環就是這樣工作的,for循環在循環一個對象的時候,會調用這個對象的iter方法,得到迭代器,然后在調用這個迭代器的next方法,去獲得這個迭代器中包涵的每個值。

二.列表和迭代器的區別在哪里?如何可以實現一個基本的迭代器?

迭代器的工作方式,是在使用的時候計算一個值獲取一個值,而列表呢,是一次性獲取所有的值,如果有很多值,就會占用很大的內存。

當自己創建一個對象時,如何讓自己的對象可迭代?

class test_class:

def init(self,start_num,stop_num):

self.start_num = start_num

self.stop_num = stop_num

def next(self):

if self.start_num < self.stop_num:

self.start_num += 1

return self.start_num

def iter(self):

return self

test_obj = test_class(0,3)

print test_obj.next()

>>>1

print test_obj.next()

>>>2

print test_obj.next()

>>>3

三.什么是生成器?

個人的理解,生成器是個比較特殊的可迭代對象,它與其他的可迭代對象不太一樣的地方,就是,其他的可迭代對象需要調用iter方法,返回個迭代器對象,然后通過迭代器對象去執行next方法,獲取迭代器中的值,但是生成器直接可以被迭代,無需執行iter方法。

在python中生成器有兩種表達形式:

函數式生成器:也就是字面意思,在常規的函數中定義的生成器,語句的返回值不再使用return去返回,而是使用yield關鍵字每次返回一個結果,一個函數中不可以有多個return,但是可以有多個yield,函數中的每一個yield都會返回一個結果,每執行一個yield,函數的執行狀態都會被‘掛起’可以理解為暫停,下次繼續調用這個函數的時候,會從上次掛起的位置繼續向下執行。

下面是關于函數式生成器的例子:

下面這個例子驗證了yield的兩種特性,第一種是一個函數可以yield多個值,有多個yield,另外一個就是函數式生成器的掛起特性。

def func1():

yield 1

print "第一個yield執行完成~"

yield 2

print "第二個yield執行完成~"

yield 3

print "第三個yield執行完成~"

for i in func1():

print i

>>>1

第一個yield執行完成~

2

第二個yield執行完成~

3

第三個yield執行完成~

生成器表達式:使用類似于列表推導式的方法,但是返回的對象不再是一個列表,而是一個可以按需生成結果的一個對象(生成器)。

例1:

for i in (i for i in range(10000)):

print i

(i for i in range(5)) 這個就是生成器表達式。

(i for i in range(10000)) = def test(): for i in range(10000):yield i

這兩個種寫法起到的作用是一樣的,只不過是寫法不同,一個是生成器表達式,另一種是函數式生成器。

有沒有覺得這種生成器表達式和列表推導式看起來很像,不同的地方就在于列表推導式是使用[]中括號,而生成器表達式使用的是()小括號?

事實就是如此,它們之間的語法確實只差一個括號,但是,生成器表達式更節省內存空間。

關于生成器,大致就說的差不多了,最后來個總結:

生成器的定義方法與普通的函數是一模一樣的,不同的地方就是生成器使用yield返回一個值,函數使用return返回一個值。

在python中,生成器會自動實現迭代協議,在沒有值可以返回的時候,返回一個StopIteration異常。

生成器使用yield語句返回一個值。yield語句掛起該生成器函數的狀態,保留足夠的信息,以便之后從它離開的地方繼續執行。

下面的例子是列表推導式和生成器表達式執行的效率對比,感興趣的小伙伴可以在自己電腦上執行一下試試。

#列表解析

sum([i for i in range(100000000)])#內存占用大,機器容易卡死

#生成器表達式

sum(i for i in range(100000000))#幾乎不占內存

總結

以上是生活随笔為你收集整理的python迭代器和生成器的作用_python迭代器与生成器的详细介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

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