python6_3 叠代器,生成器相關
阿新 • • 發佈:2018-08-11
python class 總結 集合 style with open 執行 -- iter
叠代器:不依賴索引的叠代取值方式
可叠代對象:內置有__iter__方法對象
叠代器對象:執行可叠代對象__iter__()方法得到的返回值
叠代器對象內置有__next__()方法和__iter()方法
有索引的數據類型:字符串,列表,元祖
沒有索引:字典,集合,文件
dic = {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘} dic_iter = dic.__iter__() print(dic_iter.__next__())View Code
for循環的底層運行機制:
- 先調用in後那個對象的__iter__方法
- 執行叠代器對象的__next__方法,將得到的值賦值in前的變量名
- 循環往復
叠代器的優缺點:
優點:
1.不依賴於索引取值
2.節省內存
缺點:
1.只能取一次值,除非重新得到新的叠代器對象
-----------------------------------------------------------------------------------------------------------------
生成器:自定義叠代器的方式。在函數內有yield關鍵字,得到一個返回值為生成器對象。
def f1(): print(‘first‘) yield 1 print(‘second‘) yield 2 printView Code(‘third‘) yield g=f1() result=g.__next__() print(result)
模擬一個range函數
def my_range(x, y, step=1):
while x < y:
yield x
x += step
else:
print(‘exception‘)
for item in my_range(1, 10, 2):
print(item)
總結yield:
1.自定義叠代器的方式
2.和return,都有返回值,return只能返回一次
生成器表達式:節省內存
代碼1:
l1 = [‘a‘, ‘b‘, ‘c‘, ‘d‘] l2 = (i for i in l1 if i != ‘a‘) print(next(l2))
代碼2:獲取文件中最長一行的字符數
with open(‘a3.log‘, mode=‘rt‘, encoding=‘utf-8‘) as f: print(max(len(i) for i in f))
python6_3 叠代器,生成器相關