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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python中生成器generator和迭代器Iterator的使用方法

發(fā)布時(shí)間:2023/12/1 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中生成器generator和迭代器Iterator的使用方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、生成器

1. 生成器的定義

  • 把所需要值得計(jì)算方法儲(chǔ)存起來,不會(huì)先直接生成數(shù)值,而是等到什么時(shí)候使用什么時(shí)候生成,每次生成一個(gè),減少計(jì)算機(jī)占用內(nèi)存空間

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

  • 第一種只要把一個(gè)列表生成式的 [ ] 改成 ( )
ret = (n + 1 for n in range(0,10)) # 返回值是生成了一個(gè)生成器對(duì)象<genexpr>儲(chǔ)存在16進(jìn)制的地址中<generator object <genexpr> at 0x7f909f4be150> # 如果調(diào)用次數(shù)超過生成器內(nèi)值的總數(shù)量,會(huì)報(bào)錯(cuò)
  • 第二種方法使用yield創(chuàng)建生成器
  • 只要在一個(gè)函數(shù)中存在至少一個(gè)yield關(guān)鍵字,該函數(shù)就不是普通函數(shù),是一個(gè)生成器
  • 返回一個(gè)對(duì)象,需要使用變量接收
  • 生成器可以用for進(jìn)行遍歷得到所有的值
# 定義一個(gè)斐波那契數(shù)列的生成器 def creatnum():print('-----start------')a,b = 0,1for i in range(5):print('----1-----')# 每次執(zhí)行函數(shù)都會(huì)停在此處,并將b值返回yield bprint('----2-----')a,b = b,a+bprint('----3-----')print('-----stop-----')f = creatnum() print(next(f)) print(next(f)) print(next(f)) print(next(f)) print(next(f))
  • 打印結(jié)果
-----start------ ----1----- 1 ----2----- ----3----- ----1----- 1 ----2----- ----3----- ----1----- 2 ----2----- ----3----- ----1----- 3 ----2----- ----3----- ----1----- 5

3. 啟動(dòng)生成器的方法

  • 第一種:
next(生成器的名稱)
  • 第二種:
# 生成器第一次調(diào)用時(shí)盡量不要使用send,非要使用必須用send(None) send()方法

二、迭代器

  • 可迭代數(shù)據(jù)類型(具有可迭代功能)

    • 把可以通過for...in...這類語句迭代讀取一條數(shù)據(jù)供我們使用的對(duì)象稱之為可迭代對(duì)象(Iterable)
      例如:列表,元組,字典,集合等數(shù)據(jù)類型,但他們不是可迭代對(duì)象
    • generator(生成器)
      • yield
      • 列表生成器
      • 生成器都是可迭代對(duì)象
  • 如何判斷一個(gè)對(duì)象是不是有可迭代功能

    from collections import Iterator # 列表是可迭代的 result = isinstance([1,2], Iterable) print(result) # isinstance函數(shù)會(huì)返回一個(gè)bool值 True為可迭代,反之False
  • 將具有迭代功能的數(shù)據(jù)類型轉(zhuǎn)化為可迭代器

    • 可以被next()調(diào)用并不斷返回下一個(gè)值的對(duì)象稱之為迭代器Iterator
  • 迭代器的判斷方式

    from collections import Iterator # 列表是可迭代對(duì)象 # isinstance函數(shù)會(huì)返回一個(gè)bool值 True為迭代器,反之False result = isinstance([1,2], Iterator) print(result)
  • 可迭代對(duì)象的本質(zhì)

    • 我們分析對(duì)可迭代對(duì)象進(jìn)行迭代使用的過程,發(fā)現(xiàn)每迭代一次(即在for...in...中每循環(huán)一次)都會(huì)返回對(duì)象中的下一條數(shù)據(jù),一直向后讀取數(shù)據(jù)直到迭代了所有數(shù)據(jù)后結(jié)束。那么,在這個(gè)過程中就應(yīng)該有一個(gè)“人”去記錄每次訪問到了第幾條數(shù)據(jù),以便每次迭代都可以返回下一條數(shù)據(jù)。我們把這個(gè)能幫助我們進(jìn)行數(shù)據(jù)迭代的“人”稱為迭代器(Iterator)。

    • 可迭代對(duì)象的本質(zhì)就是可以向我們提供一個(gè)這樣的中間“人”即迭代器幫助我們對(duì)其進(jìn)行迭代遍歷使用。

    • 可迭代對(duì)象通過__iter__方法向我們提供一個(gè)迭代器,我們?cè)诘粋€(gè)可迭代對(duì)象的時(shí)候,實(shí)際上就是先獲取該對(duì)象提供的一個(gè)迭代器,然后通過這個(gè)迭代器來依次獲取對(duì)象中的每一個(gè)數(shù)據(jù).

    • 那么也就是說,一個(gè)具備了__iter__方法的對(duì)象,就是一個(gè)可迭代對(duì)象。

    from collections import Iterable # 使用isinstance() 函數(shù)檢測(cè)某個(gè)對(duì)象是否是一個(gè)可迭代的對(duì)象class MyClass(object):# 可迭代對(duì)象的本質(zhì)是,類中是否定義了 __iter__() 方法def __iter__(self):return selfc1 = MyClass() # 對(duì)象c1不是可迭代對(duì)象 result = isinstance(c1, Iterable) print(result)
    • 舉例說明迭代器本質(zhì)原理

      比如,數(shù)學(xué)中有個(gè)著名的斐波拉契數(shù)列(Fibonacci),數(shù)列中第一個(gè)數(shù)為0,第二個(gè)數(shù)為1,其后的每一個(gè)數(shù)都可由前兩個(gè)數(shù)相加得到: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
      現(xiàn)在我們想要通過for...in...循環(huán)來遍歷迭代斐波那契數(shù)列中的前n個(gè)數(shù)。那么這個(gè)斐波那契數(shù)列我們就可以用迭代器來實(shí)現(xiàn),每次迭代都通過數(shù)學(xué)計(jì)算來生成下一個(gè)數(shù)。

    class Fibonacci():def __init__(self, num):# 通過構(gòu)造方法,保存num到類的成員屬性中self.num = num# 定義變量保存斐波那契數(shù)列前兩個(gè)值self.a = 0self.b = 1# 記錄當(dāng)前的變量值self.current_index = 0def __iter__(self):# 返回迭代器,因自身就是迭代器,故可以返回自己return selfdef __next__(self):# 判斷是否生成完畢if self.current_index < self.num:# 返回result = self.a# 交換兩個(gè)變量值self.a, self.b = self.b, self.a+self.bself.current_index += 1return resultelse:# 停止迭代raise StopIterationif __name__ == '__main__':# 創(chuàng)建迭代器fib_iterator = Fibonacci(5)# 使用迭代器,輸出斐波那契數(shù)列值for value in fib_iterator:print(value, end=" ")

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/yanguhung/p/10145767.html

    總結(jié)

    以上是生活随笔為你收集整理的Python中生成器generator和迭代器Iterator的使用方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。