什么是生成器?
生成器的实质就是迭代器
在python中有三种方式来获取生成器
1. 通过生成器函数
2. 通过各种推导式实现生成器
3. 通过数据的转换也可以获取生成器
将函数中的return换成yield就是生成器
运行的结果是不一样的,由于函数中存在了yield,那么这个函数就是一个生成器函数,这个时候,我们再执行这个函数的时候,就不再是函数的执行了,而是获取这个生成器.如果使用呢?想想迭代器,生成器的本质就是迭代器,所以,我们可以直接执行__next__()来执行以下生成器.
那么我们可以看到,yield和return的效果是一样的,有什么区别呢?
yield是分段来执行一个函数,return 呢? 直接停止执行函数
我们来看看send方法,send和__next__()一样都可以让生成器执行到下一个yield.
send 和 __next__() 的区别:
1. send和next() 都是让生成器向下走一次
2. send 可以给上一个yield的位置传递值,不能给最后一个yield发送至.在第一次执行生成器代码的时候不能使用send()
生成器可以使用for循环来获取内部的元素
列表推导式,生成器表达式以及其他推导式
列表推导式的常用方法:
[结果 for 变量 in 可迭代对象]
筛选模式:
[结果 for 变量 in 可迭代对象 if 条件]
生成器表达式和列表推导式的语法基本上是一样的,只是把[] 替换成()
生成器表达式和列表推导式的区别:
1. 列表推导式比较耗内存,一次性加载,生成器表达式几乎不占用内存,使用的时候才分配和使用内存
2. 得到的值不一样,列表推导式得到的是一个列表,生成器表达式获取的是一个生成器
生成器的惰性机制--------> 生成器只有在访问的时候才取值,说白了,你找他要他才会给你,不找他要,它是不会执行的
字典推导式--------集合推导式
一一有其特征
所以,推导式有: 列表推导式, 字典推导式, 集合推导式,没有元组推导式
生成器表达式: (结果 for 变量 in 可迭代对象 if 条件筛选)
生成器表达式可以直接获取到生成器对象,生成器对象可以直接进行for循环,生成器具有惰性机制