1. 程式人生 > >Python(day8)叠代器、生成器

Python(day8)叠代器、生成器

數據 Coding 叠代器協議 max函數 依賴 列表 支持 什麽是 rst

一 什麽是叠代 1 重復 2 下一次重復是基於上一次的結果
# while True:
#     cmd=input(‘>>: ‘)
#     print(cmd)

# l=[‘a‘,‘b‘,‘c‘,‘d‘]
# count=0
# while count < len(l):
#     print(l[count])
#     count+=1

#
# l=[‘a‘,‘b‘,‘c‘,‘d‘]
# for count in range(len(l)):
#     print(l[count])


# d={‘a‘:1,‘b‘:2,‘c‘:3}
#
# for k in d:
#     print(k)

python為了提供一種不依賴於索引的叠代方式,
python會為一些對象內置__iter__方法
obj.__iter__稱為可叠代的對象

二 可叠代對象:obj.__iter__ 三 叠代器:iter1=obj.__iter__() 1 iter1.__next__ 2 iter1.__iter__ iter1.__next__()

叠代器的優點
1:提供了一種不依賴於索引的取值方式
2:惰性計算。節省內存

叠代器的缺點:
1:取值不如按照索引取值方便
2:一次性的。只能往後走不能往前退
3:無法獲取長度

l=[1,2,3]
for item in l: #i=l.__iter__()
    print(item)
l=[‘x‘,‘y‘,‘z‘]
# print(l[2])
# print(l[0])

# i=l.__iter__()
# print(i.__next__())
# print(i.__next__())
# print(i.__next__())

  

#得到的叠代器:既有__iter__又有一個__next__方法
# d={‘a‘:1,‘b‘:2,‘c‘:3}
#
# i=d.__iter__() #i叫叠代器
# print(i)
# print(i.__next__())
# print(i.__next__())
# print(i.__next__())
# print(i.__next__()) #StopIteration

  

  技術分享

技術分享

iterator判斷是否為叠代器對象 iterabl判斷是否為可叠代對象 叠代對象需要.__iter__()轉換成叠代器,才能叠代 叠代器對象可以直接叠代 叠代器的應用: 1 提供了一種不依賴索引的統一的叠代方法 2 惰性計算,比如取文件的每一行

四、生成器 1、生成器函數:函數體內包含有yield關鍵字,該函數執行的結果是生成器

技術分享

def foo():
    print(‘first------>‘)
    yield 1
    print(‘second----->‘)
    yield 2
    print(‘third----->‘)
    yield 3
    print(‘fouth----->‘)


g=foo()

2、生成器就是叠代器

 

# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())

# for i in g: #obj=g.__iter__() #obj.__next__()
#     print(i)

3、

yield的功能:
1.與return類似,都可以返回值,但不一樣的地方在於yield返回多次值,而return只能返回一次值
2.為函數封裝好了__iter__和__next__方法,把函數的執行結果做成了叠代器
3.遵循叠代器的取值方式obj.__next__(),觸發的函數的執行,函數暫停與再繼續的狀態都是由yield保存的

def countdown(n):
    print(‘starting countdown‘)

    while n > 0:
        yield n
        n-=1
    print(‘stop countdown‘)
g=countdown(5)
# print(g)
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())

#
# for i in g:
#     print(i)

例題:

#1 編寫 tail -f a.txt |grep ‘error‘ |grep ‘404‘命令,周一默寫
import time
def tail(filepath,encoding=‘utf-8‘):
    with open(filepath,encoding=encoding) as f:
        f.seek(0,2)
        while True:
            line=f.readline()
            if line:
                yield line
            else:
                time.sleep(0.5)

def grep(lines,pattern):
    for line in lines:
        if pattern in line:
            #print(line)
            yield line

g1=tail(‘a.txt‘)
g2=grep(g1,‘error‘)
g3=grep(g2,‘404‘)
for i in g3:
    print(i)

總結:

1.叠代器協議是指:對象必須提供一個next方法,執行該方法要麽返回叠代中的下一項,要麽就引起一個StopIteration異常,以終止叠代 (只能往後走不能往前退)

2.可叠代對象:實現了叠代器協議的對象(如何實現:對象內部定義一個__iter__()方法)

3.協議是一種約定,可叠代對象實現了叠代器協議,python的內部工具(如for循環,sum,min,max函數等)使用叠代器協議訪問對象。

4.for循環的本質:循環所有對象,全都是使用叠代器協議。

5.(字符串,列表,元組,字典,集合,文件對象)這些都不是可叠代對象,只不過在for循環式,調用了他們內部的__iter__方法,把他們變成了可叠代對象

然後for循環調用可叠代對象的__next__方法去取值,而且for循環會捕捉StopIteration異常,以終止叠代

6.生成器:可以理解為一種數據類型,這種數據類型自動實現了叠代器協議(其他的數據類型需要調用自己內置的__iter__方法),所以生成器就是可叠代對象

7.可以理解為一種數據類型,這種數據類型自動實現了叠代器協議(其他的數據類型需要調用自己內置的__iter__方法),所以生成器就是可叠代對象

8.為何使用生成器之生成器的優點

Python使用生成器對延遲操作提供了支持。所謂延遲操作,是指在需要的時候才產生結果,而不是立即產生結果。這也是生成器的主要好處。

9.生成器小結:

1).是可叠代對象

2).實現了延遲計算,省內存啊

3).生成器本質和其他的數據類型一樣,都是實現了叠代器協議,只不過生成器附加了一個延遲計算省內存的好處,其余的可叠代對象可沒有這點好處

Python(day8)叠代器、生成器