1. 程式人生 > >python6_3 叠代器,生成器相關

python6_3 叠代器,生成器相關

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循環的底層運行機制:

  1. 先調用in後那個對象的__iter__方法
  2. 執行叠代器對象的__next__方法,將得到的值賦值in前的變量名
  3. 循環往復

叠代器的優缺點:

優點:

1.不依賴於索引取值

2.節省內存

缺點:

1.只能取一次值,除非重新得到新的叠代器對象

-----------------------------------------------------------------------------------------------------------------

生成器:自定義叠代器的方式。在函數內有yield關鍵字,得到一個返回值為生成器對象。

技術分享圖片
def f1():
    print(first)
    yield 1
    print(second)
    yield 2
    print
(third) yield g=f1() result=g.__next__() print(result)
View Code

模擬一個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 叠代器,生成器相關