python进阶之路4.1---生成器与迭代器

 

python3生成器与迭代器

1 迭代器

定义:迭代器是访问集合元素的一种方式。迭代器从集合的第一个元素开始访问,直到所有的元素访问结束。迭代器只能往前不能后退。

特点:1)访问者不需要关心迭代器的内部结构,仅需要通过next()方法不断去获取下一个内容。

2)不能随机访问集合中的某个值,只能从头到尾依次访问,便于循环比较大的数据集合,节省内存。

下面使用斐波那契数列为例,说明为何使用迭代器: 示例代码1

def fab(max):
n,a,b,=0,0,1
while n<max:
    print(b)
    a,b = b,a+b
    n= n+1
fab(2)

直接在函数fab(max)中用print打印会导致函数的可复用性变差,因为fab返回None。其他函数无法获得fab函数返回的数列。 示例代码2:

def fab(max):
    li = []
    n,a,b=0,0,1
    while n < max:
        li.append(b)
        a,b=b,a+b
        n=n+1
    return li
fab(2)

代码2满足了可复用性的需求,但是占用了内存空间,最好不要。 示例代码3

li = [x * x for x in range(10)]
print(li)
l = (x * x for x in range(10))
print(type(l))
print(l.__next__())
print(l.__next__())
print(l.__next__())

## 生成器generator ## 定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器。 def abc(tmp): while tmp>0: tmp -= 1 yield 1 print("wo")

aa = abc(10)
print(aa.__next__())
print(aa.__next__())
print(aa.__next__())
print(aa.__next__())

作用:这个yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。另外,还可通过yield实现在单线程的情况下实现并发运算的效果。

import time
def consumer(name):
    print("%s 准备尺包子!" %name)
    while True:
        baozi = yield
        print("包子[%s]来了,呗[%s]吃了!" %(baozi,name))
def producer(name):
    aa = input("put your name")
    bb = input("your name")
    c = consumer(aa)
    c2 = consumer(bb)
    c.__next__()
    if 1 ==1:
        c2.__next__()
    else:
        print('b')
    c2.__next__()
    print("make baozi")
    for i in range(10):
        time.sleep(2)
        print("做了2个包子")
        c.send(i) #返回给生成器consumer函数
        c2.send(i)
producer('lixingli')

总结: generator是用来产生一系列值得

yield则像是generator函数的返回结果
yeild唯一所做的另一件事就是保存一个generator函数的状态
generator就是一个特殊类型的迭代器(iterator)
和迭代器类似,我们可以通过使用next()来从generator中获取下一个值
通过隐式地调用next()来忽略一些值

 

更多内容请访问 李兴利博客

posted @ 2016-01-28 13:41  李兴利  阅读(152)  评论(0编辑  收藏  举报