您现在的位置是:网站首页 > 分类 > 文章详情

python中的生成器和迭代器

T2019年4月7日 11:4373人围观
简介python中生成器和迭代器的基础认知

生成器:
1、生成器

a2 = (i for i in range(1000))

此时a2就是一个生成器,调用方式'next(a2)',每调用一次生产一个元素,调用走到最后会报一个stopiteration的错误
2、上面每次手动调用next生产一个元素,但是正常情况下会使用循环去调用:

a3 =  (i for i in range(5))
for i in a3:
    print(i)

3、由于列表生成式最多只支持三元运算,假如遇到比较复杂的方式,可以用函数的方式,看一个斐波那契数列的例子:

def a6(max):
    n,a,b=0,0,1
    while n<max:
        print(b)
        a,b=b,a+b
return 'complete'

上面的列子还不是生成器,需稍加改造,就是一个生成器了,如下:

def a6(max):
    n,a,b=0,0,1
    while n<max:
        yield b
        a,b=b,a+b
return 'complete'

调用下:print(a6(10)),这个打印出来看看,就是一个生成器了,那么可以循环去调用下:

for i in f:
    print(i)

其实,yield的作用就是把函数的执行过程冻结到这一行,且返回一个值b
还需要值得注意的是,生成器的函数中,return方法就会失效,看下列子:

def a8(n):
    count = 0
    while count < n:
        print(count)
        count += 1
        yield count
return 'done'

上面函数调用执行到最后,并不会返回done
4、生成器的send方法

def a8(n):
    count = 0
    while count < n:
        print(count)
        count += 1
        sign = yield count
        print("sign",sign)
return 'done'

调用下send方法,并且传参数stop,这个时候打印出来的sign就等于stop。当然如果你sign不传值相当于默认传了None:

nr = a8(2)
n1 = next(nr)
a8.send("stop")

5、迭代器 可以被next()函数调用并不会返回下一个值得对象成为迭代器
总的来说,生成器只是迭代器的一种,我们还可以自己写一个迭代器
迭代器表示的是一个数据流

文章评论

阿里云-云大使推广
阿里云-云服务器推广

微信公众号