python----迭代器和生成器

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))#几乎不占内存

posted on 2017-08-02 20:21  一万年  阅读(205)  评论(0编辑  收藏  举报