生成器:一边循环一边计算的机制,称为生成器.
两种表现形式:
1.生成器表达式,列表解析的形式,只要把一个列表生成式的[]
改成()
,就创建了一个generator:
s1 = [i for i in range(10)] # 列表 print(s1) s2 = (i for i in range(10)) # 生成器 print(s2) print(s2.__next__()) print(s2.__next__()) print(s2.__next__())
2.生成器函数;和常规的函数一样,只是不用return而使用yield。yield相当于return,但功能有所差异,其一,yield一次返回一个结果,并挂起函数,下一次调用(用next或__next__)从上一次挂起的位置继续运行
.send() 和next()一样,都能让生成器继续往下走一步(下次遇到yield停),但send()能传一个值,这个值作为yield表达式整体的结果
def test(): yield 1 yield 2 print(test()) # 直接写函数名并不会运行函数,而是返回一个生成器 a = test() #函数赋值给变量才会保持状态 print(a.__next__()) print(a.__next__())
生长器函数的特点:需要才调用next,不需要不调用,内存不会卡
列表解析的形式
l=[1,2,3,4,] print(sum(l))#一次性加载,耗内存,卡死 print(sum(i for i in range(50000000000000000000000)))#需要才加载next,不会卡
函数形式
import time def test(): print(‘开始生孩子了‘) print(‘开始生孩子了‘) yield ‘我‘ print(‘开始生孩子了‘) yield ‘儿子‘ print(‘开始生孩子了‘) yield ‘孙子‘ res=test() time.sleep(1) print(res.__next__()) time.sleep(1)
生成器特点:
1是可迭代对象
2实现了延迟计算,省内存
3生成器比其他可迭代对象多了个延迟计算,节省内存的好处。
原文:https://www.cnblogs.com/liaoyifu/p/14052900.html