生成器 含义

一,什么是生成器

直接生成列表会占用太多内存。

python中一边循环,一边计算的机制,称为生成器(generator)

二,创建生成器方法

1.只要把列表生成式的【】改为()

a = [d for d in range(10)]

a = (d for d in range(10))

生成器使用 next(a)获取下一个值,当取到最后没有元素会报错。for循环不会报错

2.只要函数中含有yield 

可以使用 next()取值

In [30]: def fib(times):
   ....:     n = 0
   ....:     a,b = 0,1
   ....:     while n<times:
   ....:         yield b
   ....:         a,b = b,a+b
   ....:         n+=1
   ....:     return 'done'
   ....: 

In [31]: F = fib(5)

In [32]: next(F)
Out[32]: 1
捕获StopIteration错误,返回值包含在StopIteration的value中
 g = fib(5)

In [40]: while True:
   ....:     try:
   ....:         x = next(g)
   ....:         print("value:%d"%x)      
   ....:     except StopIteration as e:
   ....:         print("生成器返回值:%s"%e.value)
   ....:         break
   ....:     
value:1
value:1
value:2
value:3
value:5
生成器返回值:done

三,函数

1.send 函数

执行到yield时,可以赋值给变量

c.next() 等价 c.send(None)

In [10]: def gen():
   ....:     i = 0
   ....:     while i<5:
   ....:         temp = yield i
   ....:         print(temp)
   ....:         i+=1
In [43]: f = gen()

In [44]: f.__next__()
Out[44]: 0

In [45]: f.send('haha')
haha
Out[45]: 1

In [46]: f.__next__()
None
Out[46]: 2

In [47]: f.send('haha')
haha
Out[47]: 3
2. __next__() 方法, next() 方法
In [18]: f = gen()

In [19]: f.__next__()
Out[19]: 0
In [18]: f = gen()

In [19]: f.__next__()
Out[19]: 0

总结:

生成器可以记住上一次返回时函数体中的位置。

特点:

节约内存

所调用的参数都是上一次调用所保留的,而不是新创建的










猜你喜欢

转载自blog.csdn.net/weixin_42100915/article/details/80201656