迭代器和生成器

2022-06-22 07:09:11 字數 3626 閱讀 7455

迭代器是訪問物件元素的一種工具。主要是通過迭代的當時來訪問物件裡元素,通常是從第乙個元素開始訪問直至最後乙個元素訪問結束,每次訪問時都是基於前乙個元素的結果。

1)可以被for迴圈的物件都是可迭代物件,這些物件內部都有__iter__方法(__iter__方法用於返回乙個迭代器)。

2)迭代器不僅有__iter__方法們還有next()方法(用於呼叫迭代器,返回迭代器的下乙個元素)

3)迭代器一定是可迭代物件,可迭代物件不一定是迭代器。(list,dict,str都是可迭代物件,但不是迭代器,因為他們沒有next()方法,不能自動訪問自身。需要用for迴圈的next()方法來遍歷自身)

總結:乙個實現了__iter__方法的物件是可迭代的,乙個實現next方法的可迭代物件是迭代器。

from collections import

iterable,iterator

#判斷是否是可迭代物件

print(isinstance(,iterable)) #

true

print(isinstance({},iterable)) #

true

print(isinstance((),iterable)) #

true

print(isinstance("

aaa",iterable)) #

true

print(isinstance((x for x in range(10)),iterable)) #

true

#判斷是否是迭代器

print(isinstance(,iterator)) #

false

print(isinstance({},iterator)) #

false

print(isinstance((),iterator)) #

false

print(isinstance("

aaa",iterator)) #

false

print(isinstance((x for x in range(10)),iterator)) #

true

#

! /usr/bin/env python

#-*- coding: utf-8 -*-

from collections import

iterable,iterator

class

myrange(object):

def__init__

(self, n):

self.idx =0

self.n =n

def__iter__

(self):

return

self

defnext(self):

if self.idx

val =self.idx

self.idx += 1

return

self.n[val]

else

:

raise

stopiteration()

l = [4,5,6,7,8]

obj =myrange(l)

print obj.next() #

4print obj.next() #

5print obj.next() #

6print(isinstance(obj,iterator)) #

true

迭代器優點:

1.提供了一種通用不依賴索引的迭代取值方式

2.同一時刻在記憶體中只存在乙個值,更節省記憶體

迭代器缺點:

1.取值不如按照索引的方式靈活,不能取指定的某乙個值,只能往後取,不能往前去

2.無法**迭代器的長度

生成器是一種特殊的迭代器,一般表現為一邊迴圈,一邊計算。

當函式內包含yield關鍵字,呼叫函式不會執行函式體**,會得到乙個返回值,該返回值就是生成器物件

1)只能在函式內使用

2)yield提供了一種自定義迭代器的解決方案

3)yield可以儲存函式的暫停的狀態

4)yield對比return:相同點:都可以返回值,值得型別與個數沒有限制。

不同點:yield可以返回多次值,而return只能返回一次值函式就會結束

1)生成器是這樣乙個函式,它記住上一次返回時在函式體中的位置。

2)對生成器函式的第二次(或第 n 次)呼叫跳轉至該函式中間,而上次呼叫的所有區域性變數都保持不變。

3)生成器不僅「記住」了它資料狀態;生成器還「記住」了它在流控制構造(在命令式程式設計中,這種構造不只是資料值)中的位置。

4)生成器是乙個函式,而且函式的引數都會保留。

5)迭代到下一次的呼叫時,所使用的引數都是第一次所保留下的,即是說,在整個所有函式呼叫的引數都是第一次所呼叫時保留的,而不是新建立的

1)python中,yield就是這樣的乙個生成器。

2)當你問生成器要乙個數時,生成器會執行,直至出現 yield 語句,生成器把yield 的引數給你,之後生成器就不會往下繼續執行。

3)當你問他要下乙個數時,他會從上次的狀態開始執行,直至出現yield語句,把引數給你,之後停下。如此反覆

4)在python中,當你定義乙個函式,使用了yield關鍵字時,這個函式就是乙個生成器

5)它的執行會和其他普通的函式有很多不同,函式返回的是乙個物件,而不是你平常所用return語句那樣,能得到結果值。如果想取得值,那得呼叫next()函式

6)每當呼叫一次迭代器的next函式,生成器函式執行到yield之處,返回yield後面的值且在這個地方暫停,所有的狀態都會被保持住,直到下次next函式被呼叫,或者碰到異常迴圈退出。

def

fib(max_num):

a,b = 1,1

while a

yield

b a,b=b,a+b

g = fib(10) #

生成乙個生成器:[1,2, 3, 5, 8, 13]

print(g.__next__()) #

第一次呼叫返回:1

print(list(g)) #

把剩下元素變成列表:[2, 3, 5, 8, 13]

生成器斐波那契

生成器和迭代器

可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...

迭代器和生成器

1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...

生成器和迭代器

1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...