python生成器运用及理解

python生成器

为什么要用生成器?
其中一个原因就是为了节省空间内存
这里举个例子

def My_range1(a,b,c=1):
    """
    生成了列表
    """
    res= []
    while a < b :
        res.append(a)
        a += c
    return res

for i in My_range1(1,10**8):
	print(i,end=',')

以上的代码,返回的是一个列表,但是我们可以看到这里遍历了10的8次方减一次,
那么他会全部传到这个列表当中并且返回过来。
当我们每个数只需要用一次的时候就会显得很累赘,占用空间很大,
这里我们就可以用到生成器了。

def My_range2(a,b,c=1):
    """
    这种方式并没有生成列表
    是一个一个的返回
    几乎不占内存
    """
    while a < b : #当a小于b得时候
        yield a
        a += c #若下一次在调用这个方法 a += c 运行完a += c过后再运行 yield a 返回a

for i in My_range2(1,10**8): #所有这里的遍历是遍历的生成器
    print(i,end=",")

这种方式当中并没有生成列表返回,而是一个一个的返回,几乎不占内存。
这就是生成器的好处之一。

这里我们来type一下看看是什么类型,返回的是字符串?还是整数?
在这里插入图片描述

这里我们能看到返回的是一个生成器
来看一下具体是怎么运行的吧!!!
这里我们调两个断点

第一次按f7时到了while循环

在这里插入图片描述

第二次按f7时,跳到了yield a

在这里插入图片描述

当我第三次按f7时,并没有执行a += c ,而是直接跳到了print输出结果

在这里插入图片描述

第四次按f7时,我们可以看见在进行第二次for循环.

在这里插入图片描述

第五次按f7时并没有直接进行while循环,而是接着第一次的while循环继续执行a += c

在这里插入图片描述

第六次按f7时,跳到了while,那就说明新的一次while循环开始了

结论:yield返回时并没有生成一个列表,而是返回一个生成器,当yield运行结束时,并不会继续执行后面的函数,而是当新的一次while循环开始时接着上一次while循环yield后面继续执行,然后再开始新的while循环,依此类推。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值