yield_yield用法 - CSDN
yield 订阅
Yield的功能将控制权转移给其它图形对象,包括非PowerBuilder对象。该函数检测消息队列,如果有消息,就把消息取出。利用该函数可以在执行耗时较长的操作时把控制权转让给其它应用。 展开全文
Yield的功能将控制权转移给其它图形对象,包括非PowerBuilder对象。该函数检测消息队列,如果有消息,就把消息取出。利用该函数可以在执行耗时较长的操作时把控制权转让给其它应用。
信息
形    式
yield return ;
外文名
Yield
返回值
Boolean
在 iterator 
用作方法、运算符或访问器的体
Yield语法
Yield()Boolean返回值。如果在消息队列中提取到了消息,那么函数返回TRUE,否则返回FALSE。用法正常情况下,PowerBuilder应用程序在执行一段代码(比如函数或事件处理程序)的过程中不响应用户的操作。对耗时短暂的代码段来说,这种处理方式没有什么不妥的地方,但是,如果某个代码段的执行耗时较长,应用程序又希望为用户提供更多的控制权,那么需要在这段代码中插入Yield()函数,让用户能够进行其它操作,特别在循环执行的代码中更应该如此。应用程序执行Yield()函数后,如果发现消息队列中存在消息,它将允许对象处理这些消息,处理之后,继续Yield()函数后面代码的执行。因此,代码中插入Yield()函数将降低应用程序的运行效率。---------------------------------------------------------------------------------------------------------------------------------------------------------yield(C# 参考)在迭代器块中用于向枚举数对象提供值或发出迭代结束信号。它的形式为下列之一:yield return ;yield break;备注 :计算表达式并以枚举数对象值的形式返回;expression 必须可以隐式转换为迭代器的 yield 类型。yield 语句只能出现在 iterator 块中,该块可用作方法、运算符或访问器的体。这类方法、运算符或访问器的体受以下约束的控制:不允许不安全块。方法、运算符或访问器的参数不能是 ref 或 out。yield 语句不能出现在匿名方法中。当和 expression 一起使用时,yield return 语句不能出现在 catch 块中或含有一个或多个 catch 子句的 try 块中。在下面的示例中,迭代器块(这里是方法 Power(int number,int power))中使用了 yield 语句。当调用 Power 方法时,它返回一个包含数字幂的可枚举对象。注意 Power 方法的返回类型是 IEnumerable(一种迭代器接口类型)。
收起全文
精华内容
参与话题
  • 理解python中yield关键字

    万次阅读 多人点赞 2018-01-03 05:51:26
    原文:http://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html可迭代对象mylist 是一个可迭代的对象。当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代的对象:>>> mylist =...

    本文转自stackoverflow中一个问题的译文
    原文:http://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html

    可迭代对象


    mylist 是一个可迭代的对象。当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代的对象:

    >>> mylist = [x*x for x in range(3)]
    >>> for i in mylist :
    ...    print(i)
    0
    1
    4

    在这里,所有的值都存在内存当中,所以并不适合大量数据

    生成器


    • 可迭代
    • 只能读取一次
    • 实时生成数据,不全存在内存中
     >>> mygenerator = (x*x for x in range(3))
    >>> for i in mygenerator :
    ...    print(i)
    0
    1
    4

    注意你之后不能再使用for i in mygenerator

    yield关键字


    • yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器
    • 当你调用这个函数的时候,函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象
    • 当你使用for进行迭代的时候,函数中的代码才会执行
    >>> def createGenerator() :
    ...    mylist = range(3)
    ...    for i in mylist :
    ...        yield i*i
    ...
    >>> mygenerator = createGenerator() # create a generator
    >>> print(mygenerator) # mygenerator is an object!
    <generator object createGenerator at 0xb7555c34>
    >>> for i in mygenerator:
    ...     print(i)
    0
    1
    4

    第一次迭代中你的函数会执行,从开始到达 yield 关键字,然后返回 yield 后的值作为第一次迭代的返回值. 然后,每次执行这个函数都会继续执行你在函数内部定义的那个循环的下一次,再返回那个值,直到没有可以返回的。

    控制生成器的穷尽


    >>> class Bank(): # let's create a bank, building ATMs
    ...    crisis = False
    ...    def create_atm(self) :
    ...        while not self.crisis :
    ...            yield "$100"
    >>> hsbc = Bank() # when everything's ok the ATM gives you as much as you want
    >>> corner_street_atm = hsbc.create_atm()
    >>> print(corner_street_atm.next())
    $100
    >>> print(corner_street_atm.next())
    $100
    >>> print([corner_street_atm.next() for cash in range(5)])
    ['$100', '$100', '$100', '$100', '$100']
    >>> hsbc.crisis = True # crisis is coming, no more money!
    >>> print(corner_street_atm.next())
    <type 'exceptions.StopIteration'>
    >>> wall_street_atm = hsbc.create_atm() # it's even true for new ATMs
    >>> print(wall_street_atm.next())
    <type 'exceptions.StopIteration'>
    >>> hsbc.crisis = False # trouble is, even post-crisis the ATM remains empty
    >>> print(corner_street_atm.next())
    <type 'exceptions.StopIteration'>
    >>> brand_new_atm = hsbc.create_atm() # build a new one to get back in business
    >>> for cash in brand_new_atm :
    ...    print cash
    $100
    $100
    $100
    $100
    $100
    $100
    $100
    $100
    $100
    ...
    展开全文
  • python中yield的用法详解——最简单,最清晰的解释

    万次阅读 多人点赞 2019-11-20 15:24:13
    首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我...

    首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受。

    接下来是正题:

    首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了。看做return之后再把它看做一个是生成器(generator)的一部分(带yield的函数才是真正的迭代器),好了,如果你对这些不明白的话,那先把yield看做return,然后直接看下面的程序,你就会明白yield的全部意思了:

    def foo():
        print("starting...")
        while True:
            res = yield 4
            print("res:",res)
    g = foo()
    print(next(g))
    print("*"*20)
    print(next(g))

    就这么简单的几行代码就让你明白什么是yield,代码的输出这个:

    starting...
    4
    ********************
    res: None
    4

    我直接解释代码运行顺序,相当于代码单步调试:

    1.程序开始执行以后,因为foo函数中有yield关键字,所以foo函数并不会真的执行,而是先得到一个生成器g(相当于一个对象)

    2.直到调用next方法,foo函数正式开始执行,先执行foo函数中的print方法,然后进入while循环

    3.程序遇到yield关键字,然后把yield想想成return,return了一个4之后,程序停止,并没有执行赋值给res操作,此时next(g)语句执行完成,所以输出的前两行(第一个是while上面的print的结果,第二个是return出的结果)是执行print(next(g))的结果,

    4.程序执行print("*"*20),输出20个*

    5.又开始执行下面的print(next(g)),这个时候和上面那个差不多,不过不同的是,这个时候是从刚才那个next程序停止的地方开始执行的,也就是要执行res的赋值操作,这时候要注意,这个时候赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候res赋值是None,所以接着下面的输出就是res:None,

    6.程序会继续在while里执行,又一次碰到yield,这个时候同样return 出4,然后程序停止,print函数输出的4就是这次return出的4.

     

    到这里你可能就明白yield和return的关系和区别了,带yield的函数是一个生成器,而不是一个函数了,这个生成器有一个函数就是next函数,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的,所以调用next的时候,生成器并不会从foo函数的开始执行,只是接着上一步停止的地方开始,然后遇到yield后,return出要生成的数,此步就结束。

    ****************************************************************************************************************************************

    def foo():
        print("starting...")
        while True:
            res = yield 4
            print("res:",res)
    g = foo()
    print(next(g))
    print("*"*20)
    print(g.send(7))

    再看一个这个生成器的send函数的例子,这个例子就把上面那个例子的最后一行换掉了,输出结果:

    starting...
    4
    ********************
    res: 7
    4

    先大致说一下send函数的概念:此时你应该注意到上面那个的紫色的字,还有上面那个res的值为什么是None,这个变成了7,到底为什么,这是因为,send是发送一个参数给res的,因为上面讲到,return的时候,并没有把4赋值给res,下次执行的时候只好继续执行赋值操作,只好赋值为None了,而如果用send的话,开始执行的时候,先接着上一次(return 4之后)执行,先把7赋值给了res,然后执行next的作用,遇见下一回的yield,return出结果后结束。

     

    5.程序执行g.send(7),程序会从yield关键字那一行继续向下运行,send会把7这个值赋值给res变量

    6.由于send方法中包含next()方法,所以程序会继续向下运行执行print方法,然后再次进入while循环

    7.程序执行再次遇到yield关键字,yield会返回后面的值后,程序再次暂停,直到再次调用next方法或send方法。

     

     

     

    这就结束了,说一下,为什么用这个生成器,是因为如果用List的话,会占用更大的空间,比如说取0,1,2,3,4,5,6............1000

    你可能会这样:

    for n in range(1000):
        a=n

    这个时候range(1000)就默认生成一个含有1000个数的list了,所以很占内存。

    这个时候你可以用刚才的yield组合成生成器进行实现,也可以用xrange(1000)这个生成器实现

    yield组合:

    def foo(num):
        print("starting...")
        while num<10:
            num=num+1
            yield num
    for n in foo(0):
        print(n)

    输出:

    starting...
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

     xrange(1000):

    for n in xrange(1000):
        a=n

     其中要注意的是python3时已经没有xrange()了,在python3中,range()就是xrange()了,你可以在python3中查看range()的类型,它已经是个<class 'range'>了,而不是一个list了,毕竟这个是需要优化的。 

                                                                                                     谢谢大家

    如果你感觉对你有帮助,你的赞赏是对我最大的支持!

    展开全文
  • 多线程之yield()方法

    千次阅读 2019-04-10 21:12:28
    Thread.yield()方法作用是:暂停当前正在执行的线程对象(及放弃当前拥有的cup资源), 并执行其他线程。yield()做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其 他线程获得运行机会。因此,使用...

    一:简介

    1. 简介
             Thread.yield()方法作用是:暂停当前正在执行的线程对象(及放弃当前拥有的cup资源),
      并执行其他线程。yield()做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其
      他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行
      但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中
    2.    结论:       
         yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状
         态转到可运行状态
      ,但有可能没有效果。

    二:代码示例

    1.  下面我们比较示例代码运行的时间作为比较结果,用来测试yield方法的使用结果   
    2. 创建继承Thread类的线程类MyThread.java
        
    3. 创建测试类
        
    4.   效果如下:
         
         可以发现我们在运行MyThread线程的时候CPU是独占时间片的,没有其他线程和它抢CPU,
          所以使用的时间是23毫秒。
    5. 下面我们修改一下MyThread类,添加yield方法 ,将它让给其他任务去占用CPU执行时间
          
    6. 效果
             
          可以发现我们将CPU让给其他资源导致速度变慢。 
    展开全文
  • yield()函数的使用

    千次阅读 2017-01-15 23:07:54
    yield函数在并发编程中是非常重要的一个概念,尤其在多核计算机还不是那么普及的年代,要完成一个“并发”程序,是不得不借助yield函数的。 我们知道,yield的意思是“屈服、礼让”,在程序中表现为当前线程会尽量...

    yield函数在并发编程中是非常重要的一个概念,尤其在多核计算机还不是那么普及的年代,要完成一个“并发”程序,是不得不借助yield函数的。
    我们知道,yield的意思是“屈服、礼让”,在程序中表现为当前线程会尽量让出CPU资源来给其他线程执行,但是yield函数背后究竟发生了什么呢,我们结合线程、栈来说明函数背后是如何执行,程序是如何配合CPU来完成yield函数的。

    首先我们来看一个例子,

    100:A(){
        B();
        104:...
    }
    200:B(){
        yield();
        204:...
    }
    
    300:C(){
        D();
        304:...
    }
    400:D(){
        yield();
        404:...
    yeald(){
        找到 ?;
        jump ?;
    }
    }

    上面一段代码,整体说明:A(),B()为一个线程在执行,C(),D()为另一个线程在执行,在执行到B()函数的时候,调用yield从a线程跳到b线程执行,执行到D()函数的时候,又调用yield返回a线程继续执行。
    如果我们这样设计行不行呢?

    两个线程公用一个栈:pc指到100,a线程进入A()函数开始执行,进入B()函数之前将指针104压栈,B函数刚执行就遇到yield函数,将204压栈,a线程停止执行,yield给b线程开始执行,进入C函数,将304压栈后进入D(),进入D遇到yield函数则将404压栈。注意,此时yield函数我们的本意是希望调回到a线程仅需执行204,此时弹栈,弹出404,这就不对了,我们不是要执行204吗?
    可以看到两个线程公用一个栈,使用yield函数是无法完成我们想要的效果的。设计者们意识其实线程在进程中的模型和进程在操作系统中的模型在某些方面是由一些相似的,一个线程应该对应一个栈与其他线程隔离就像一个进程对应一块隔离的内存区域一样,如果这样当我们从a线程跳到b线程执行的时候,如果需要跳回来则CPU需要在跳过去的时候记录a线程的相关信息执行完b线程后才能通过相关信息再跳回a线程来执行,这不是和我们学习过的PCB(process control block)非常相似吗?

    多个线程维护各自的栈,这是一个非常伟大的过渡,让很多线程操作都变得清晰起来。

    yield(){
        TCB2.esp = esp;
        esp = TCB1.esp;
    }

    上面这个yield的函数才是真正从b线程跳回a线程执行的操作,我们通过栈操作来屡清执行的顺序。Thread control block 线程控制块,可以理解为由进程来进行管理的一种数据结构,这个数据结构中有线程的相关信息,其中一个字段为esp,它是当前线程的栈指针。回到上面的函数中,esp是CPU寄存器的指针指向的位置,可以看到,yield函数其实就是把当前CPU执行的线程的栈保存起来,并且取出需要执行的线程的栈指针,赋给寄存器开始执行。
    现在就显而易见了,当a线程跳到b线程的时候,a线程的栈中104 204先后压栈,跳到b线程后304 405先后压入当前线程的栈中,又通过切换寄存器的栈指针跳回到a线程中来执行,此时弹栈,继续执行204,一切是那么完美!
    尔后,每个线程中的地址和变量不断出入栈、线程不断的切来切去,这样就完成了我们设计的“并发”程序!

    展开全文
  • Python中yield的理解与使用

    万次阅读 多人点赞 2018-06-28 10:57:55
    总结:通常的for...in...循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件。它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。它的缺陷是所有数据都在...
  • yield是什么

    2018-10-15 16:58:36
    您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield 的概念。 如何生成斐波那契數列 斐波那契(Fibo...
  • Python3中yield对初学者一直是一个难点存在,网上很多教程,噼里啪啦写了很多,也举了很多例子,但是读完之后还是不知所以然,下面问题还是不知道如何回答。 yield究竟是干嘛的? yield是怎么执行的? yield的好处...
  • yieldyield*都是js中的关键字,他们不能直接使用;只能配合Generator进行使用;Generator是一种函数,声明方式和普通函数类似,只不过要在function后面加个*(function*) yidld yield是关键字,其语法如下: [rv] =...
  • yield函数其实就是把当前CPU执行的线程的栈保存起来,并且取出需要执行的线程的栈指针,赋给寄存器开始执行。 二: 每个线程中的地址和变量不断出入栈、线程不断的切来切去,这样就完成了我们设计的“并发”程序! ...
  • 一张图理解yield 瞬间明白yield用法

    千次阅读 2019-10-19 15:14:11
    python yield 用法
  • python函数中yield的用法详解

    万次阅读 多人点赞 2018-12-02 01:47:43
    首先比较下return 与 yield的区别: return:在程序函数中返回某个值,返回之后函数不在继续执行,彻底结束。 yield: 带有yield的函数是一个迭代器,函数返回某个值时,会停留在某个位置,返回函数值后,会在前面...
  • FactorVAE

    千次阅读 2018-09-26 17:22:41
    摘要: 论文阐述了非监督学习在变量的独立因子中生成数据的表示(学习)的解耦问题(disentangled representations),提出FactorVAE算法,算法通过激励表示的分布,使之成为因式,在整个维度中独立。...
  • java中yield()方法如何使用

    万次阅读 2019-01-14 11:00:48
    Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。 yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级...
  • unity的协程毫无疑问是个非常棒的设计,但是也存在着一些坑和一些误区。
  • 分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!... ① sleep()方法给其他线程运行机会时不考虑线程...② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield(...
  • ES6——对yieldyield*的理解

    万次阅读 2019-03-24 21:44:59
    概念yieldyield*都是配合Generator进行使用的。yieldyield是关键字,其语法如下:[rv] = yield [expression]; expression:是Generator函数返回的遍历器对象调用next方法是所得到的值; rv:是遍历其对象调用next...
  • ES6 yield

    万次阅读 2016-09-10 16:41:36
    一、介绍 yield 关键字用来暂停和继续一个生成器函数。我们可以在需要的时候控制函数的运行。  yield 关键字使生成器函数暂停执行,并返回跟在它后面的表达式的当前值。与return类似,但是可以使用next方法让生成...
  • yield yield不仅可以返回值,也可以接收值 # yield返回值 def gen(): for x in [&amp;amp;amp;quot;a&amp;amp;amp;quot;, &amp;amp;amp;quot;b&amp;amp;amp;quot;, &amp;amp;amp;quot;c&...
  • python中yield和return对比

    万次阅读 2016-09-28 16:23:59
    相同点功能都是返回程序执行结果区别yield返回执行结果并不中断程序执行,return在返回执行结果的同时中断程序执行。
  • 线程中的yield()方法

    千次阅读 2017-10-24 20:06:16
    Thread.yield()方法作用是:暂停当前正在执行的线程对象(及放弃当前拥有的cup资源),并执行其他线程。 yield()做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用...
1 2 3 4 5 ... 20
收藏数 170,096
精华内容 68,038
关键字:

yield