我来解释一下这个程序:
首先大家要知道为什么这个函数可以用在for循环中。不用问,因为这个函数是可迭代的,也就是这个函数可以每次都返回一个值。
但是我们在gen()函数里看不到__iter__()和next() 方法。其实它隐藏在yield里。高级语言就是这样,隐藏了好多东西。这个和c
语言就不同了。C语言可以看到每个细节。在这里程序执行到yield 1的时候就停止了,下面的程序不再执行,然后返回一个值“1”.
当下一个for的之后程序接着往下执行到yeild 2。程序停止执行,然会返回一个值“2”。但是还有一个问题就是,最后yield下面的"next again" 会打印出来呢?这也可能就是在执行完最后一个yield 的时候,for i in gen()的时候, 发生了一些什么动作,导致最后一个yield后面的代码也被执行了。
如果我们修改一下这个程序如下:
#!/usr/bin/env python
#__metaclass__ = type
def gen():
print 'enter'
yield 1
print 'next'
return
print 'next 2'
yield 2
print 'next 3'
for i in gen():
print i
#######################
程序打印如下:
enter
1
next
看明白了这就是yield和return的区别。yield可以向下运行。而return返回后这个函数余下的部分就不能执行了。
4: yield 的原理