`
f002489
  • 浏览: 264888 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

yield 用法说明

阅读更多

http://blog.myspace.cn/e/404486536.htm

http://users.softlab.ntua.gr/~ttsiod/yield.html

 

yield 简单说来就是一个生成器生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

  • 生成器 是 一个函数

函数的所有参数都会保留

  • 第二次调用 此函数 时

使用的参数是前一次保留下的.

  • 生成器还“记住”了它在流控制构造

生成器不仅“记住”了它数据状态。 生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。由于连续性使您在执行框架间任意跳转,而不总是返回到直接调用者的上下文(如同生成器那样),因此它仍是比较一般的。

yield 生成器的运行机制

当你问生成器要一个数时,生成器会执行,直至出现 yield 语句,生成器把 yield 的参数给你,之后生成器就不会往下继续运行。 当你问他要下一个数时,他会从上次的状态开始运行,直至出现yield语句,把参数给你,之后停下。如此反复直至退出函数。

例子:Python 排列,组合生成器

#生成全排列
def perm(items, n=None):
    if n is None:
        n = len(items)
    for i in range(len(items)):
        v = items[i:i+1]
        if n == 1:
            yield v
        else:
            rest = items[:i] + items[i+1:]
            for p in perm(rest, n-1):
                yield v + p
 
#生成组合
def comb(items, n=None):
    if n is None:
        n = len(items)    
    for i in range(len(items)):
        v = items[i:i+1]
        if n == 1:
            yield v
        else:
            rest = items[i+1:]
            for c in comb(rest, n-1):
                yield v + c
 
a = perm('abc')
for b in a:
    print b
    break
print '-'*20
for b in a:
    print b

结果如下:

102 pvopf006 ~/test> ./generator.py
abc
--------------------
acb
bac
bca
cab
cba

可以看到,在第一个循环break后,生成器没有继续执行,而第二个循环接着第一个循环执行

分享到:
评论

相关推荐

    C#中yield用法使用说明

    本文介绍了C#中yield的使用方法,yield 语句不能出现在匿名方法,其他相关内容就仔细阅读下文吧

    C# yield在WCF中的错误用法(一)

    这里要说的是另一个问题:对于返回类型为IEnumerable的方法来说,我们可以使用yield return的方式来输出返回集合的元素。但是如果我们不了解yield 关键字背后的实现机制,很有可能造成很大的问题。 这是一个WCF相关...

    举例详解Python中yield生成器的用法

    yield是生成的意思,但是在python中则是作为生成器理解,生成器的用处主要可以迭代,这样简化了很多运算模型(还不是很了解是如何简化的)。...说明存在yield的函数没有被运行,即暂停 <generator ob

    python中yield关键字用法

    首先,把yield理解成return,可以用作...”汉字,说明未执行函数体,g的打印结果为一个生成器。 那什么时候才会执行函数体呢?当需要用到返回的数值时执行,如下: def f(): print(提示字符!) yield 9 g=f() print(g

    C#使用yield关键字让自定义集合实现foreach遍历的方法

    foreach遍历是C#常见的功能,而本文通过实例形式展现了C#使用yield关键字让自定义集合实现foreach遍历的方法。具体步骤如下: 一般来说当我们创建自定义集合的时候为了让其能支持foreach遍历,就只能让其实现...

    通过实例解析c# yield关键字使用方法

    先看下面的代码,通过yield return实现了类似用foreach遍历数组的功能,说明yield return也是用来实现迭代器的功能的。 using static System.Console; using System.Collections.Generic; class Program { //一个...

    C# yield关键字详解

    如果你在语句中使用 yield 关键字,则意味着它在其中出现的方法、运算符或 get 访问器是迭代器。 通过使用 yield 定义迭代器,可在实现自定义集合类型的 IEnumerable 和 IEnumerator 模式时无需其他显式类(保留枚举...

    C#基础之yield与Singleton

    下面有2个小例子,分别没有使用yield和有使用yield。先来看第一个,当我调试时显然执行到GetResult()方法时将会跳转到方法内部并且执行完,接着再去执行输出当前值语句。从结果可以看出第一个是0,说明返回的枚举数...

    php和C#的yield迭代器实现方法对比分析

    主要介绍了php和C#的yield迭代器实现方法,简单说明了yield迭代器的原理,并结合具体实例形式对比分析了php和C#的yield迭代器相关使用技巧,需要的朋友可以参考下

    FT-Yield-Report-Generator:FT良率月报自动生成工具

    Yield-Report-Generator 良率月报自动生成工具人生苦短,必须偷懒概述自动绘制系统中的PareTo柱状图和TrendChart趋势图自动生成本月所有产品的Summary自动绘制每位工程师的Summary柱状图例子PareTo柱状图:...

    matlab非参数代码-us-yield-curve-macroeconomics:分析美国国债收益率曲线对宏观经济变量依赖性的案例研究

    matlab非参数代码收益率曲线和宏观经济相互作用:来自非参数函数滞后回归方法的证据。 论文支持材料:Rubin, T. arXiv:2007.02763 (2020) A. 内容 该存储库包含美国国债收益率曲线对美国...除非另有说明,代码作者为T

    ruby-enumerables-generalized-map-and-reduce-lab-hou01-seng-ft-082420

    广义地图和归约实验室学习目标识别使用块可以避免的重复陈述构造块的两种方法从方法内执行块说明yield关键字的目的在方法和块之间传递数据介绍如您在上一课中所看到的,在我们各种基于map的方法和基于reduce的方法...

    ruby-enumerables-generalized-map-and-reduce-lab-online-web-prework

    说明yield关键字的目的 在方法和块之间传递数据 介绍 如您在上一课中所看到的,在我们各种基于map的方法和基于reduce的方法之间有很多重复的代码。 这会在您体内引发“过敏”React。 您学会了“ DRY out”您的代码。...

    ruby-enumerables-generalized-map-and-reduce-lab-lon01-seng-ft-082420

    说明yield关键字的目的 在方法和块之间传递数据 介绍 如您在上一课中所看到的,在我们各种基于map的方法和基于reduce的方法之间有很多重复的代码。 这会在您体内引发“过敏”React。 您学会了“ DRY out”您的代码。...

    Linq基础学习资料,通俗易懂

    5.13.1 接口方法说明 int Compare(object x, object y) 13 5.13.2 ArrayList.Sort (IComparer) 方法 13 5.14 IComparer <T> 14 5.14.1 接口方法override int Compare(T x, T y)说明 14 5.14.2 List.Sort ...

    C#语言规范(4.0版本)

    10.5.2.1 对常量使用静态只读字段 291 10.5.2.2 常量和静态只读字段的版本控制 291 10.5.3 可变字段 292 10.5.4 字段初始化 293 10.5.5 变量初始值设定项 293 10.5.5.1 静态字段初始化 294 10.5.5.2 实例字段初始化 ...

    微软C#语言规范,C#语言教程中文版

    10.5.2.1 对常量使用静态只读字段 291 10.5.2.2 常量和静态只读字段的版本控制 291 10.5.3 可变字段 292 10.5.4 字段初始化 293 10.5.5 变量初始值设定项 293 10.5.5.1 静态字段初始化 294 10.5.5.2 实例字段初始化 ...

    C#语言规范4.0

    10.5.2.1 对常量使用静态只读字段 291 10.5.2.2 常量和静态只读字段的版本控制 291 10.5.3 可变字段 292 10.5.4 字段初始化 293 10.5.5 变量初始值设定项 293 10.5.5.1 静态字段初始化 294 10.5.5.2 实例字段初始化 ...

    C#_语言规范_4.0_中文版

    10.5.2.1 对常量使用静态只读字段 291 10.5.2.2 常量和静态只读字段的版本控制 291 10.5.3 可变字段 292 10.5.4 字段初始化 293 10.5.5 变量初始值设定项 293 10.5.5.1 静态字段初始化 294 10.5.5.2 实例字段初始化 ...

Global site tag (gtag.js) - Google Analytics