python中的迭代器與生成器

2022-07-22 09:06:11 字數 4354 閱讀 7475

'__iter__'方法的就是可迭代物件

列舉些可迭代物件:str,list,tuple,dict,set,range,檔案控制代碼

獲取乙個物件的所有的方法dir();把每個方法以字串的格式放在乙個列表中返回回來

s1 = 'asdfas'

print(dir(s1))

#結果['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

判斷所有方法裡有沒有__iter__

s1 = 'asdfas'

print('__iter__' in dir(s1))

#true

可迭代物件是不能直接for迴圈取值的,之所以我們能是因為for迴圈內部自動幫我們轉化成迭代器了

可迭代物件可以轉化成迭代器

s = 'qwer'

s1 = iter(s)

print('__next__' in dir(s1))

#變數 = iter(要轉化的可迭代物件)

#或者這樣

s = 'qwer'

s1 = s.__iter__()

print('__next__' in dir(s1))

#(iter()函式就是呼叫的這個方法)

迭代器是用next()乙個乙個取值的

s = 'qwer'

s1 = iter(s) #s1 = s.__iter__()

print('__next__' in dir(s1))

print(next(s1)) #s1.__next__()

print(next(s1)) #s1.__next__()

print(next(s1)) #s1.__next__()

print(next(s1)) #s1.__next__()

#少乙個next可以,那就少取乙個值,多乙個不應,就報錯(停止迭代的這麼乙個錯誤)

'''trueqw

er'''

練習:把乙個列表轉化成迭代器,並用next乙個乙個取值

li = [11,22,33,44,55,66]

l1 = iter(li)

#print('__next__' in dir(l1))

print(next(l1))

print(next(l1))

print(next(l1))

print(next(l1))

print(next(l1))

print(next(l1))

優點

節省記憶體。

惰性機制:next一次就取乙個值

有乙個迭代器模式可以很好的解釋上面這兩條:迭代是資料處理的基石。掃瞄記憶體中放不下的資料集時,我們要找到一種惰性獲取資料項的方式,即按需一次獲取乙個資料項。這就是迭代器模式。

缺點

速度慢。以時間換空間

不走回頭路。

利用while迴圈模擬for迴圈對可迭代物件進行取值的機制

li = [1,2,3,4,5,6,7]

obj = iter(li)#將可迭代物件轉化成迭代器

while 1:

try:

print(next(obj))

except stopiteration:

break

生成器:python社群,生成器與迭代器看成是一種。生成器的本質就是迭代器。唯一的區別:生成器是我們自己用python**構建的資料結構。迭代器都是提供的,或者轉化得來的。

只要有yield就是生成器

生成器函式獲得生成器:yield

def func():

print(111)

print(222)

yield 3

a = 1

b = 2

c = a+b

print(c)

yield 4

ret = func()

print(next(ret))

print(next(ret))

'''111

222334

'''

yield將乙個可迭代物件,變成乙個生成器

def func():

l1 = [1,2,3,4,5]

yield from l1

#yield from l1 相當於

'''yield 1

yield 2

yield 3

yield 4

yield 5

'''#yield from 將l1這個列表變成了迭代器返回

ret = func()

print(next(ret))

print(next(ret))

print(next(ret))

'''123

'''

用一行**構建乙個比較複雜有規律的列表。

li = 

for i in range(1,11):

print(li)

#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

l1 = [i for i in range(1,11)]

print(l1)

#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

列表推導式:分為兩類

篩選模式:滿足條件的留下來,不滿足扔了

生成器表示式:與列表推導式的寫法幾乎一模一樣。也有迴圈模式,篩選模式,多層迴圈構建,寫法上只有乙個不同:[ ] 換成 ( )

print([i for i in range(1,11)])#列表推導式

#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print((i for i in range(1,11)))#生成器表示式

#at 0x000001e2308b2228>

obj = (i for i in range(1,11))

print(next(obj))#1

print(next(obj))#2

print(next(obj))#3

print(next(obj))#4

#或者這樣for迴圈

obj = (i for i in range(1,11))

for i in obj:

print(i)

'''12

3456

78910

'''

python中的迭代器與生成器

實現乙個迭代器,應滿足如下條件 簡單示例 usr bin env python class sampleiter sample iterator sampleiter sampleiter sampleiter.next a sampleiter.next b sampleiter.next tra...

python中的迭代器與生成器

1 迭代器 迭代器協議是指 物件必須提供乙個next方法,執行該方法要麼返回迭代中的下一項,要麼就引起乙個 stopiteration異常,以終止迭代 只能往後走不能往前退 可迭代物件 實現了迭代器協議的物件 如何實現 物件內部定義乙個 iter 方法 協議是一種約定,可迭代物件實現了迭代器協議,p...

Python生成器與迭代器

生成器只有在用的時候會出現在記憶體中,對比列表全部存在記憶體中,減少了記憶體占用 next 函式 依次取生成器的值 s x 2 for x in range 1000 中括號是列表解析,小括號表示生成一系列值,就是生成器 s at 0x7fa20aa8b048 print next s 用next ...