1. 程式人生 > >python----叠代器和生成器

python----叠代器和生成器

pytho rate 文本 內存占用 padding 惰性 pin gin eight

1、python中的for循環

for i in [1,2,3,4]:
     print(i) 

2、叠代和可叠代協議

iterable:可叠代的,可重復的、叠代的

可叠代:籠統的說就是可以被for循環,如,字符串(str)、列表(list)、元組(tuple),字典(dict),集合(set),range、map、filter、enumerate等。

叠代---叠代器:把某個數據集內的元素一個個取出來

可叠代協議的定義:是內部實現了_iter_方法

能被for循環的都是可叠代的,內部必須有一個_iter_方法

iterator:叠代器,叠代程序

_next_方法:就是一個一個取值

***叠代器遵循叠代器協議:必須擁有_iter_方法和_next_方法

l=[1,2,3,4]
a=l.__iter__()
while True:
    try:
        x=a.__next__()
        print(x)
    except StopIteration:
        break

初識生成器
python中提供的生成器

1、生成器函數:用yield語句返回結果,一擦返回一個結果

2、生成器表達式 類似列表推到,生成器返回按產生一個結果的一個對象,不是一次構建一個結果列表

3、生成器Generator

本質就是叠代器(自帶了_iter_方法和_next_方法)

4、生成器偶函數

import time
def genrator_func():
    a
=1 print(定義了a變量) yield a b=2 print(定義了一個b變量) yield b g=genrator_func() print(g:,g) #打印g可以發現g就是一個生成器 print(_*20) #分割線 print(next(g)) time.sleep(1) #sleep一秒看清執行過程 print(next(g))

生成器函數二

# def func():
#     #生產衣服
#     for i in range(2000000):
#         yield #生產了第%s件衣服%i
# func1
=func() # print(func1.__next__())#要一件衣服 # print(func1.__next__())#再買一件衣服 # print(func1.__next__())#再要買一件衣服 # num=0 # for i in func1: #要一批衣服 # print(1) # num+=1 # if num == 5: # break

更過應用

# import time
# def tail(filename):
#     f=open(filename)
#     f.seek(0,2)    #從文件末尾算起
#     while True:
#         line = f.readline()   #讀取文件新的文本行
#         if not line:
#             time.sleep(0.1)
#             continue
#         yield line
# tail_g=tail(tmp)
# for line in tail_g:
#     print(line)

計算移動平均值

def averager():
     total=0.0
     count=0
     average=None
     while True:
         term=yield  average
         total+=term
         count+=1
         average = total/count
 g_avg=averager()
 next(g_avg)
 print(g_avg.send(10))
 print(g_avg.send(30))
 print(g_avg.send(5))

計算移動平均值-預激協程的裝飾器

def time(func):
    def inner(*args,**kwargs):
        ret=func(*args,**kwargs)
        next(ret)
        return ret
    return inner
@time
def averager():
    total=0.0
    ccount=0
    average=None
    while True:
        term = yield average
        total +=term
        ccount+=1
        average=total/ccount
g_avg = averager()
print(g_avg.send(10))
print(g_avg.send(20))
print(g_avg.send(5))

yiel from

def gen1():
    for c in AB:
        yield c
    for i in range(3):
        yield i
print(list(gen1()))
def gen2():
    yield from AB
    yield from range(3)
    print(list(gen2()))
liebiao推導式和生成器表達式

egg_list=[雞蛋%s %i for i in range(10)] #列表解析 laomuji=(雞蛋%s %i for i in range(10)) #生成器表達式 print(laomuji) print(next(laomuji)) #next本質就是調用_next_ print(laomuji.__next__()) print(next(laomuji))

本章小結
可叠代對象:

擁有_iter_方法 如:range()、str、list、tuple、dict、set

特性:惰性運算

叠代器:Iterator:

擁有_iter_方法和_next_方法 如:iter(range()),iter(str),iter(list)、iter(tuple)、iter(set)、reversed(list_o)、map(func,list_o)、filter(func,list_o)、file-o

生成器Generator:

  本質:叠代器,所以擁有__iter__方法和__next__方法

  特點:惰性運算,開發者自定義

使用生成器的優點:

1.延遲計算,一次返回一個結果。也就是說,它不會一次生成所有的結果,這對於大數據量處理,將會非常有用。

#列表解析
sum([i for i in range(100000000)])#內存占用大,機器容易卡死
 
#生成器表達式
sum(i for i in range(100000000))#幾乎不占內存

python----叠代器和生成器