• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

python 中yield的用法详解

python 水墨上仙 1891次浏览

python 中yield的用法详解

包含了关键字”yield”的函数就不是普通的函数。当含有这个关键字的函数被调用的时候,这个函数在遇到yield的时候会停止运行,并且返回一个迭代器(iterator)。每次请求一个值,就会执行生成的代码。直到遇到一个yield或者return。
首先,我们先了解什么是迭代器。

 
lst=[1,2,3,4,5]
for i in lst
    print i

从这个例子我们可以看的出来,每循环一次i的值就会指向列表的下一个元素,大家认为这是正常的,那么为什么i会得到列表的下一个元素呢?
其实在for的循环中列表就使用了迭代器。每一次循环迭代器就使用next方法返回一个值。当然这个迭代是隐形的,大家是看不见的。
我们可以实现一个可迭代的函数。

#!/ust/bin/env python
class IterExample():
    def __init__(self):
        self.a = 0
    def next(self):
        self.a += 1
        if self.a > 10:raise StopIteration
        return self.a
    def __iter__(self):
        return self
ie = IterExample()
for i in ie:
    print i

上面的列表默认已经具备了迭代方法,不用我们实现。如果一个函数不是可迭代的那是不能用在循环里的。
下面我们来解决yield
其实这个很简单。只不过大家看的例子复杂了。看看下面的例子你立刻就会理解它。

#!/usr/bin/env python
#__metaclass__ = type
def gen():
        print 'enter'
        yield 1
        print 'next'
        yield 2
        print 'next again'
for i in gen():
        print i
#########################

这个例子打印如下:
enter
1
next
2
next&nbspagain
我来解释一下这个程序:
首先大家要知道为什么这个函数可以用在for循环中。不用问,因为这个函数是可迭代的,也就是这个函数可以每次都返回一个值。
但是我们在gen()函数里看不到__iter__()和next()&nbsp方法。其实它隐藏在yield里。高级语言就是这样,隐藏了好多东西。这个和c
语言就不同了。C语言可以看到每个细节。在这里程序执行到yield&nbsp1的时候就停止了,下面的程序不再执行,然后返回一个值“1”.
当下一个for的之后程序接着往下执行到yeild&nbsp2。程序停止执行,然会返回一个值“2”。但是还有一个问题就是,最后yield下面的”next&nbspagain”&nbsp会打印出来呢?这也可能就是在执行完最后一个yield&nbsp的时候,for&nbspi&nbspin&nbspgen()的时候,&nbsp发生了一些什么动作,导致最后一个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返回后这个函数余下的部分就不能执行了。


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明python 中yield的用法详解
喜欢 (0)
加载中……