码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-08-02 21:06:52      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:集合   str   字符串   产生   cep   *args   while   过程   大数   

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----迭代器和生成器

标签:集合   str   字符串   产生   cep   *args   while   过程   大数   

原文地址:http://www.cnblogs.com/mds---123/p/7275880.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!