python 中yield的用法详解的代码

下面资料是关于python 中yield的用法详解的代码,希望能对小伙伴有些用处。

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

#########################




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

#######################




程序打印如下:enter1next看明白了这就是yield和return的区别。yield可以向下运行。而return返回后这个函数余下的部分就不能执行了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 好友说这部剧特好看,就看了。看完不久,忙来偷闲,想写一点东西。 01 智慧与娃娃脸并存的余周周,阳光下像个...
    槿苒阅读 2,385评论 7 15
  • 咳嗽症状持续。已经不怎么发热。嗓子依旧难受,全身依旧乏力,工作注意力好转。吃饭的胃口逐渐恢复,但是还是没有味觉。鼻...
    Sim和他的朋友们的乌托邦阅读 159评论 0 1
  • 枕边的手机闹玲响起,05:55,用温热的手揉搓脸颊两下,顺便提了提耳垂,清醒不少。洗涑换衣完毕,喝下两口保温杯中的...
    慎独狼阅读 321评论 0 0
  • 调目,是我们根据鱼情,结合用饵和打法,给定浮标的一个基准尺度,而这个具体的尺度是确定钓目的基础。我们根据不同的鱼情...
    钓侠阅读 2,001评论 0 0
  • 人活着就是为了解决困难,这是生命的意义,也是生命的内容。逃避不是办法,知难而上往往是解决问题的最好手段。 没规划的...
    酷听听书阅读 249评论 0 0