一句话解释:含有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