yield

Posted 清源居士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yield相关的知识,希望对你有一定的参考价值。

yield , 初碰见不太可能会明白是什么意思.  从这里可以看出python的特点, 由于在背后做了大量的隐藏的工作, 才使得形式和使用上边的简洁和优美.  

 

这是一个很不好理解的概念, 请参考下面这两篇文章:

http://www.cnblogs.com/coderzh/archive/2008/05/18/1202040.html

http://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html

总结下来, 

1, 包含yield的函数是generator.

2, yield是表达式, 和return类似, 但是返回的是generator.

 

 

这篇文章写的很好, 从一个"如何生成斐波那契數列" 的例子开始.  从中能学到很多东西.  仔细看看这篇文章. 

https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/

看看这个例子, 当最后两行写出优美简介的循环时, 其实背后做了很多事情, 这再次说明了python的特点. 这绝对是一门易学难精的语言. 

# 利用 iterable 我们可以把 fab 函数改写为一个支持 iterable 的 class,以下是第三个版本的 Fab:
# 你可以尝试一下去掉 __iter__ 这个函数的定义会发生什么
class Fab(object):

    def __init__(self, max):
        self.max = max
        self.n, self.a, self.b = 0, 0, 1

    def __iter__(self):
        return self

    def next(self):
        if self.n < self.max:
            r = self.b
            self.a, self.b = self.b, self.a + self.b
            self.n += 1
            return r
        raise StopIteration()


for n in Fab(8): print(n)

 

为了易用和简洁, 不惜创造出了yield的这个魔法, 在形式之美的背后, 是迭代器, 生成器等众多手段.

# 使用yield的方式
def fab(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        # print b
        a, b = b, a + b
        n += 1


for n in fab(8): print(n)

 

以上是关于yield的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用IENUMERABLE,YIELD

python的生成器与yield

yield()返回参数函数使用

python yield函数

python yield函数

ruby yield 关键字用法实例