今天研究一下 python 中的 yield。
首先要明白的是 generator 叫做“迭代器”,是可以用在 for 循环中的,包括 生成器 和 带有 yield 表达式的 generator function.
这里yield 有两个优点:
1. 不会把所有数据取出来放进内存里,而是返回一个对象,用多少取多少,节省内存空间。
2. 从上一次中断的地方继续,不会结束循环。
这里可以想一下你做爬虫的那个 work_list[],实际上是非常大的,直接用for循环去访问没有用yield访问来的科学。
1. yield
yield英文意思是“生产” / "屈服"。其实加了 yield的函数就是一个generator。next() 函数可以让generator 执行。
这里看一个例子。
可以看到直接调用这个 test() 函数,函数并没有执行,而是返回了一个 generator 的对象,因为函数里面有yield表达式。通过next() 函数可以恢复 generator 执行,直到下一个yield 。
可以看到,第一个 next(),函数执行到第一个yield。第二个 next() ,寻找下一个yield,最后没有yield,会报异常。
next() 和 send(None)
在 generator 这里,next() 和 send(None) 的作用是一样的。
next(c) 就相当于 c.send(None) 。 看一个例子
这里主要看一下。首先每次 next() 都把 generator 推向下一个 yield。 send() 函数如果含参数的话,就会替换 yield 表达式。从而输出。
使用 generator
在之前的云图脚本中,我们使用 jieba.cut() 方法返回的对象就是一个 gene。只需要用循环去访问即可。
其实我们在 genertaror 中,基本从来都不会用到 next() 函数去写,上面写的东西只是给你理解 generator 这个东西。
下面看一个实际应用的例子