zoukankan      html  css  js  c++  java
  • python(4)yield函数

    这个函数据说叫做函数发生器,看文档也没看明白,后来在网上看了一个用法,发现实际上相当于return 语句,如下代码:

     
    def addlist(alist):
        for i in alist:
            yield i + 1

    取出alist的每一项,然后把i + 1塞进去。然后通过调用取出每一项:

    alist = [1, 2, 3, 4]
    for x in addlist(alist):
        print x,

    结果为:2 3 4 5

    这个调用非常清晰,每到yield i + 1就相当于return i + 1,即执行到这儿,此函数就结束了,有了前面基本的认识,对于后面较高级用法有很大的作用。

    较高级用法:

    原先的yield是作为一条语句使用,现在可将之作为表达式使用。

    def g():
        a0 = 'first'
        print 'step a0', 'a0= ', a0
        a1 = yield a0 + ‘_myadd’
        print 'step a1', 'a1 = ', a1
        a2 = yield a1
        print 'step a2', 'a2 = ', a2
    f = g()
    f.next()
    f.send('x1')
    f.send('x2')

    返回如下结果:

    step a0 a0=  first
    'first'
    step a1 a1 =  x1
    'x1'
    step a2 a2 =  x2

    Traceback (most recent call last):
      File "<pyshell#133>", line 1, in <module>
        f.send('x2')
    StopIteration

    简单解释,前面说到yield相当于return,

    调用f.next()时,执行到yield a0,函数挂起,函数值为‘first_myadd’

    调用f.send(‘x1’),将表达式yield a0赋值为'x1’,并赋给a1,执行到yield a1,函数挂起,函数值为’x1’

    调用f.send(‘x2’),将表达式yield a1赋值为‘x2’,并赋给a2,打印完成后发现没有yield使其挂起,引发异常

    注意,yield表达式值和函数值是不同的概念,像a1, a2通过=获取的皆为yield表达式值,它们是通过f.send(x)传递进来的,而类似

    yield a0 + ‘myadd’,则是函数挂起时的值。

  • 相关阅读:
    vue-fullcalendar插件
    iframe 父框架调用子框架的函数
    关于调试的一点感想
    hdfs 删除和新增节点
    hadoop yarn 实战错误汇总
    Ganglia 安装 No package 'ck' found
    storm on yarn(CDH5) 部署笔记
    spark on yarn 安装笔记
    storm on yarn安装时 提交到yarn失败 failed
    yarn storm spark
  • 原文地址:https://www.cnblogs.com/luhouxiang/p/2429780.html
Copyright © 2011-2022 走看看