深入理解 Python中的yield
深入理解 Python3 yield yield是 python 内置的关键字,它能产生一个生成器(Generator)。 0x01. Generators 只要函数中有yield就会变成一个generator object生成器对象,生成器对象可以迭代,但与iterable不同的是它只能迭代一次。先来看一个简单的例子 >>> def foo(): ... yield 1 ... yield 2 ... yield 3 ... >>> g = foo() >>> g <generator object foo at 0x7ffb08326ca8> >>> for i in g: ... print(i) ... ... 1 2 3 >>> for i in g: ... print(i) ... ... >>> 当你调用foo这个函数的时候,函数内部的代码并不立马执行 ,这个函数只返回一个生成器对象,如果有庞大的数据它不像iterable占用内存,会每次调用时才计算产生值。 其实for循环隐式的调用__next__()方法,直到遇到StopIteration停止。 >>> def bar(): ... yield 'a' # 第一次调用next()代码运行到这,产生'a' ... yield 'b' # 第二次调用next()代码运行到这,产生'b' ... yield 'c' # 第三次调用next()代码运行到这,产生'c' ... >>> g = bar() >>> next(g) 'a' >>> next(g) 'b' >>> next(g) 'c' >>> next(g) Traceback (most recent call last): File "<input>", line 1, in <module> next(g) StopIteration 也可以使用 Python3 内置的next()函数调用,直到产生StopIteration错误。 下面是一个斐波那契数列的例子 >>> def fib(n): ... a, b = 0, 1 ... while n >= 0: ... b, a = a, a+b ... n -= 1 ... yield b ... ... >>> for i in fib(5): ... print(i) ... ... 0 1 1 2 3 5 0x02. send Method /Coroutines yield不仅可以通过next()取得产生的值,还可以通过send()接受值。 ...