python疑难问题---12、python生成器
一、总结
一句话总结:
在Python中,一边循环一边计算的机制,称为生成器:generator。
g3 = (x+3 for x in range(20)) for i in g3: print(i) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
1、为什么要有生成器?
我又想要得到庞大的数据,又想让它占用空间少,那就用生成器!
2、Python创建生成器两种方式?
A、生成器推导式:第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:g = (x * x for x in range(20))
B、yield关键字:如果一个函数中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator函数。调用函数就是创建了一个生成器(generator)对象。
3、生成器的工作原理?
(1)、生成器(generator)能够迭代的关键是它有一个next()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常。
(2)、带有 yield 的函数不再是一个普通函数,而是一个生成器generator。可用next()调用生成器对象来取值。next方法的两种方式: t.__next__() 或 next(t)。
(3)、yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。
二、python生成器
博客对应课程的视频位置:12、python生成器-范仁义-读书编程笔记
https://www.fanrenyi.com/video/32/370
1、生成器定义
在Python中,一边循环一边计算的机制,称为生成器:generator。
2、为什么要有生成器
列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。
如:仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。
简单一句话:
3、如何创建生成器
A、生成器推导式
第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
L = [x * x for x in range(20)]
print(L)
print(type(L))
g = (x * x for x in range(20))
print(g)
print(type(g))
print(next(g))
print(next(g))
print(next(g))
print(g.__next__())
print(g.__next__())
print(next(g))
print('暂停一下')
print(next(g))
print(next(g))
print(g.__next__())
创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。
B、yield关键字
方法二, 如果一个函数中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。调用函数就是创建了一个生成器(generator)对象。
def f1(max):
n=0
while n<max:
yield n
n+=1
f=f1(6)
print(f)
print(f.__next__())
print(next(f))
print('暂停一下')
print(f.__next__())
print(next(f))
print(f.__next__())
print(next(f))
print('暂停一下')
print(f.__next__())
print(next(f))
如果生成器里面的数据读完了,继续执行next方法,会报StopIteration的错误
4、生成器的工作原理
(1)生成器(generator)能够迭代的关键是它有一个next()方法,
工作原理就是通过重复调用next()方法,直到捕获一个异常。
(2)带有 yield 的函数不再是一个普通函数,而是一个生成器generator。
可用next()调用生成器对象来取值。next方法的两种方式: t.__next__() 或 next(t)。
可用for 循环获取返回值(每执行一次,取生成器里面一个值)
(基本上不会用next()来获取下一个返回值,而是直接使用for循环来迭代)。
(3)yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。
5、for循环读取生成器的值
for循环 循环调用next方法
g2 = (x ** 3 for x in range(20))
for i in range(5):
print(next(g2))
for i in range(5):
print(next(g2))
直接使用for循环来迭代
因为生成器是一个迭代器,所以可以直接用for循环迭代
g3 = (x+3 for x in range(20))
for i in g3:
print(i)
g4 = (x+3 for x in range(20))
# 如果只想从生成器中取部分数据,可以直接break打断循环
n = 10
for i in g4:
print(i)
if(n<2):
break
n-=1
在Python中,一边循环一边计算的机制,称为生成器:generator。
1、遍历列表的三种方式-范仁义-读书编程笔记
https://www.fanrenyi.com/video/32/293
2、字典排序-范仁义-读书编程笔记
https://www.fanrenyi.com/video/32/294
3、可变和不可变数据类型-范仁义-读书编程笔记
https://www.fanrenyi.com/video/32/295
4、python文件处理-范仁义-读书编程笔记
https://www.fanrenyi.com/video/32/305
5、二维列表初始化-范仁义-读书编程笔记
https://www.fanrenyi.com/video/32/306
6、python中浅拷贝和深度拷贝-范仁义-读书编程笔记
https://www.fanrenyi.com/video/32/307
7、python中的with...as...-范仁义-读书编程笔记
https://www.fanrenyi.com/video/32/320
8、只有一个数的元组表示-范仁义-读书编程笔记
https://www.fanrenyi.com/video/32/343
9、Python类中call函数的作用-范仁义-读书编程笔记
https://www.fanrenyi.com/video/32/361
10、python遍历字典的几种方式-范仁义-读书编程笔记
https://www.fanrenyi.com/video/32/368
11、python内嵌for...in循环-范仁义-读书编程笔记
https://www.fanrenyi.com/video/32/369
12、python生成器-范仁义-读书编程笔记
https://www.fanrenyi.com/video/32/370
13、Python切片操作-范仁义-读书编程笔记
https://www.fanrenyi.com/video/32/377