关于python中的生成器

前言:我们知道,当数据很多时,我们可以将数据放在list中,但是当数据多到一定程度时我们还能用list来存储数据吗?比如一百万个元素,首先我们需要考虑内存问题,其次,如果我们仅仅用到这一百万个元素中的几个元素,那么其他元素所占用的空间岂不是白白浪费掉了,针对与这种情况,python是通过生成器(generator)来解决的

生成器生成表达式

本文用生成器生成表达式与列表生成式进行对比体现出生成器的特点看以下代码:

L=[x*x for x in range(10)]
print(L)
g=(x*x for x in range(10))
print(g)

前两行代码生成一个列表并且打印,将[]改为()即为生成器表达式,两个打印最终结果如下

第一行代码成功打印出了L里面存放的数据,第二行代码打印的是生成器所处的地址

这是生成器的主要特点:里面所有的数据都是动态生成的,打印出来的只是一个地址,那么我们怎么去打印这里面的动态生成的数据呢?

1.用next:

>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25

但显然这种方法很不好用,如果需要打印前100个元素甚至更多时,这种方法显得很笨

2.用for循环:

g=(x*x for x in range(10))
for i in g:
	print(i)

生成器函数

在讲生成器函数之前引进一个普通的函数:斐波拉契数列函数,有关斐波拉契数列,不了解的可以上网搜索这里不再细讲来看函数打印斐波拉契数列的实现:

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

注意:

    a, b = b, a + b

这句的意思相当于把b的值赋给a,把a+b的值赋给b

当想打印出数列的前几项,只需要给函数传参就够了,上述函数实际上动态生成了数列的元素,要想把其转化为生成器只需要把

    print(b)
换成
yield b

就可以了

生成器函数的工作原理:在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值