Python 基礎第十三天(叠代器,生成器)
今日主要內容:
1.可叠代對象
2.叠代器
3.生成器
1.可叠代對象
什麽是可叠代對象:內部含有__iter__方法的對象,就是可叠代對象.
查看__iter__方法:dir(對象)
可叠代對象就遵循可叠代協議。
接觸過的可叠代對象有:str,list,tuple,dict,set,range
叠代器:f1文件句柄
如何判斷
法一:
例:s = ‘laonanhai‘
print(‘__iter__‘ in dir(s))
法二:
例:l = [1, 2, 3, 4]
from collections import Iter
print(isinstance(l, Iterable))
返回結果:# True
2.叠代器
什麽是叠代器
可叠代對象轉化成叠代器:可叠代對象.__iter__() --->叠代器
不僅含有__iter__方法,還要含有__next__方法
例:l1 = [1,2,3]
l1_obj = l1.__iter__()
print(‘__iter__‘ in dir(l1_obj)) #True
print(‘__next__‘ in dir(l1_obj)) #True
判斷叠代器:
法一:
print(‘__iter__‘ in dir(l1_obj)) #判斷是否是可叠代對象
print(‘__next__‘ in dir(l1_obj)) #判斷是否為叠代器
法二:
from collections import Iterator
print(isinstance(l1_obj, Iterator))
叠代器的好處:
1.節省內存空間,只有執行__next__函數,才會進行下一步,並加載到內存中.
2.滿足惰性機器
3.不能反復取值,不可逆.
例:用while循環模擬for循環內部機制
思路:
‘‘‘
1.將可叠代對象轉化成叠代器
2.內部使用__next__方法,取值
3.運用了異常處理去處理報錯
‘‘‘
li = [1,2,3,4,5,6,7]
li_obj = li.__iter__()
while True:
try:
i = li_obj.__next__()
printe(i)
except Exception:
break
# Exception 表示一切非代碼錯誤
3.生成器
(1)
什麽是生成器:生成器本質是叠代器,是特殊的叠代器.所以叠代器的有點它都具有.
(2)
生成器的產生方式:
1.生成器函數構造
2.生成器推導式構造
3.數據類型的轉換
1.生成器函數構造
方法:
正常函數下面將return 變成yield,就可以將函數轉變成生成器.
例:
def funcl():
print(666)
print(555)
return 777
print(funcl())
def funcl1():
print(666)
print(555)
yield 444
yleld 777
g = funcl()
print(g)
結論:# <generator object func1 at 0x0000000001197888>
解析:
第一:函數中只要有yield 那他就不是一個函數,而是一個生成器
第二:g稱作生成器對象
執行:
print(g.__next__())
print(g.__next__())
print(g.__next__()) #超出yield數量,報錯
sent的作用
next 和send 功能一樣,都是執行一次
send可以給上一個yield賦值
例:
def generator():
print(123)
content = yield 1
print(content)
print(456)
yield 2
g = generator()
g.__next__()
g.send(‘hello‘)
Python 基礎第十三天(叠代器,生成器)