生成器函数

生成器函数

## 生成器

是可以迭代的,但是你 只可以读取它一次 ,因为它并不把所有的值放在内存中,它是实时地生成数据:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator :
...    print(i)
0
1
4

你不可以再次使用 for i in mygenerator , 因为生成器只能被迭代一次:

先计算出0,然后继续计算1,然后计算4,一个跟一个的…

生成器函数

包含 yield 语句的函数可以用来创建生成器对象,这样的函数也称生成器函数。

当你调用这个函数的时候,函数内部的代码并不立马执行

yield 语句与 return 语句的作用相似,都是用来从函数中返回值。 return 语句一旦执行会立刻结束函数的运行,而每次执行到 yeild 语句并返回一个值之后会暂停或挂起后面代码的执行,下次通过生成器对象的 __next__(),内置函数 net(),for 循环遍历生成器对象元素或其他方式显式“索要”数据时恢复执行。

生成器具有惰性求值的特点。

>>> def f():              #求斐波那契数列
...     a,b = 1, 1
...     while True:
...             yield a
...             a, b = b, a+b
...
>>> a = f()
>>> for i in range(10):
...     print(a.__next__(),end=' ')			#调用一次__next__()得出一个值
...
1 1 2 3 5 8 13 21 34 55
a = f()
>>> next(a)
1
>>> next(a)
1
>>> next(a)
2
>>> a.__next__()
3
>>> def f():
...     yield from 'abcdefg'
...
>>> x = f()
>>> next(x)
'a'
>>> for item in x:
...     print(item,end=' ')
...
b c d e f g
>>> def gen():
...     yield 1
...     yield 2
...     yield 3
...
>>> x,y,z = gen()                    #序列解包
>>> print(x,y,z)
1 2 3
>>> def gen(start, end):           #使用send()方法传入新值。
...     i = start
...     while i<end:
...             v = (yield i)
...             if v:
...                     i = v
...             else:
...                     i+=1
...
>>> g = gen(1,101)
>>> next(g)
1
>>> next(g)
2
>>> g.send(10)
10
>>> next(g)
11
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值