我所理解的生成器(其他)(关键词:生成器/generator/yield)

一句话解释:含有yield关键字的函数就是生成器(generator)。(注意:这里的定义只是生成器(generator)的一种。)


生成器的执行流程:在每次调用next()的时候,顺序执行,遇到yield语句,则返回yield后的值,下次执行时,从上次yield语句处,往后执行


什么意思?直接上代码:


代码清单1:

>>> def odd():
	print('s1')
	yield 1
	print('s2')
	yield 2
	print('s3')
	yield 3

	
>>> o = odd()
>>> next(o)
s1
1
>>> next(o)
s2
2
>>> next(o)
s3
3
>>> next(o)


代码清单2:

>>> def count(n):
	while n > 0:
		yield n
		n -= 1

		
>>> c = count(5)
>>> next(c)
5
>>> next(c)
4
>>> next(c)
3
>>> next(c)
2
>>> next(c)
1
>>> next(c)
Traceback (most recent call last):
  File "<pyshell#125>", line 1, in <module>
    next(c)
StopIteration



参考文献:

1.廖雪峰:生成器


------------------------------------------------------------------------------------------------------------------

凡是类似:

def something():
    result = []
    for ... in ...:
        result.append(x)
    return result
都可以用生成器函数来替换:

def iter_something():
    for ... in ...:
        yield x



参考文献:

1.https://foofish.net/iterators-vs-generators.html

2.Iterables vs. Iterators vs. Generators

3.https://docs.python.org/2/library/stdtypes.html#iterator-types



------------------------------------------------------------------------------------------------------------------

生成器函数中,每次yield语句执行一次,返回一个结果(位置A),生成器函数被挂起,下次执行时,从位置A往后继续执行。


什么意思?直接上代码:

>>> def aGen(n):
	print('i am a gen')
	while n >0:
		print 'before yield'
		yield n
		n -= 1
		print 'yield end'

		
>>> aGen(5)
<generator object aGen at 0x031C7170>
>>> a = aGen(5)
>>> a.next()
i am a gen
before yield
5
>>> a.next()
yield end
before yield
4
>>> a.next()
yield end
before yield
3
>>> a.next()
yield end
before yield
2
>>> a.next()
yield end
before yield
1
>>> 
>>> a.next()
yield end

Traceback (most recent call last):
  File "<pyshell#58>", line 1, in <module>
    a.next()
StopIteration





参考文献:

1.https://www.zhihu.com/question/20829330



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值