python之生成器和迭代器

列表中的数据均保存在内存中,若数据量较大的话将会对内存造成很大的消耗。如果在某些情况下仅需访问列表中前几个元素,则后面元素对内存的占用更是浪费。

为了解决此问题,python中出现了生成器:

在python中,一边循环,一边计算的机制称为生成器。

创建生成器的方法主要有两种:

第一种:

>>> g = (x*x for x in range(10))
>>> g
<generator object <genexpr> at 0x000001A4107102C8>

遍历生成器内容的方法:
1、

>>> for i in g:
...     print(i)
...
0
1
4
9
16
25
36
49
64
81

2、

>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
49
>>> next(g)
64
>>> next(g)
81
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

其实还可以用对象自带的__next__()函数遍历生成器的内容:

>>> g.__next__()
0
>>> g.__next__()
1
>>> g.__next__()
4
>>> g.__next__()
9
>>> g.__next__()
16
>>> g.__next__()
25
>>> g.__next__()
36
>>> g.__next__()
49
>>> g.__next__()
64
>>> g.__next__()
81
>>> g.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

生成生成器(generator)的工作原理实质上就是通过重复调用next()方法,直到捕获一个异常。

第二种: 使用yield函数创建生成器。注意:带有 yield 的函数不再是一个普通函数,而是一个生成器generator。

我们通过斐波那契数列来引出此方法!在这里插入图片描述
我们通过一般函数实现此函数:

def fib(N):
    n,a,b = 0,0,1
    while n < N:
        a,b = b,a+b
        n = n+1
        print(a)
    return "done"

print(fib(10))

#程序运行结果如下:
1
1
2
3
5
8
13
21
34
55
done

我们通过yield函数,通过生成器实现此函数。

def fib(N):
    print("斐波那契数列")
    n,a,b = 0,0,1
    while n < N:
        a,b = b,a+b
        n = n+1
        yield a
    return "done"

D = fib(10)
for i in D:
    print(i)

#程序运行结果:
斐波那契数列
1
1
2
3
5
8
13
21
34
55

实质上,我们可以将yield函数看作一个收纳器,将这些元素依次收纳进去,需要的时候再依次取出来!

>>> def foo(num):
...     while num<8:
...             num = num + 1
...             yield num
...
>>> a = foo(3)
>>> print(next(a))
4
>>> print(next(a))
5
>>> for i in a:
...     print(i)
...
6
7
8

通过上面的例子我们也可以看到,遍历生成器内容的方式有两种,一种是通过next()函数,另一种是通过for循环。
在这里插入图片描述
以上内容,如有错误,敬请批评指正!谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值