1. 程式人生 > >python函數五(叠代器,生成器)

python函數五(叠代器,生成器)

ext 構建 什麽是 器協 生成 false 推導式 gen ict

一。叠代器

1.可叠代對象(只含有__iter__方法的數據是可叠代對象)

常見的可叠代對象:str list tuple dict set range

1.1什麽是可叠代對象?

方法一: dir(被測對象) 如果 他含有‘__iter__ ‘,那這個對象就叫做可叠代對象.
遵循可叠代協議

s = alex
l = [1,2,3,4,5]
print(__iter__ in dir(s))
print(__iter__ in dir(l))
# 輸出結果:
# True
# True

2.叠代器(含有__iter__方法,並且含有__next__方法的數據是叠代器)

常見的叠代器:文件句柄

2.1叠代器的取值

s = alex
l = [1,2,3,4,5]
s1 = s.__iter__()
print(s1.__next__())
print(s1.__next__())
print(s1.__next__())
# 輸出結果: a   l   e

2.2叠代器的意義:
1)叠代器節省內存.
2)叠代器惰性機制.
3)叠代器不能反復,一直向下執行.

for循環的機制就是完美的運用的叠代器
內部含有__iter__方法,他會將可叠代對象先轉化成叠代器。然後在調用__next__方法,他有異常處理的方法.

3.可叠代對象與叠代器的關系

1)可叠代對象------>叠代器
可叠代對象.__iter__()------->叠代器

s = alex
l = [1,2,3,4,5]
l1 = l.__iter__()     #叠代器
print(l1)   #iterator  遵循叠代器協議
# 輸出結果:<list_iterator object at 0x00000156B0EC7630>

判斷是可叠代對象還是叠代器

方法二(isinstance與type類似,但是功能比type更強大

l = [1,2,3,4,5]
l_iter = l.__iter__()
from collections import Iterable
from collections import Iterator
print(isinstance(l,Iterable))               #
True print(isinstance(l,Iterator)) #True print(isinstance(l_iter,Iterator)) #False print(isinstance(l,list)) #True

二。生成器

生成器的本質就是叠代器,生成器是自己用python代碼寫的叠代器.
1,可以用生成器函數
2,可以用各種推導式構建叠代器.
3,可以通過數據轉化.

def gener():
    print(111)
    yield 222
    count = yield 333
    print(count)
    yield 444
    yield 555
g = gener()
print(g)
print(g.__next__())
print(g.__next__())
print(g.send(aaa))
print(g.__next__())
# 輸出結果:
# <generator object gener at 0x0000014CDE5B1BF8>
# 111
# 222
# 333
# aaa
# 444
# 555

4.send
1)send 和next功能一樣
2)給上一個yiled 整體發送一個值
send不能給最後一個yield發送值
獲取第一個值的時候,不能用send 只能用next

    

python函數五(叠代器,生成器)