yield 应该是让那个对象在被遍历的时候才动态执行的,例子来源自http://blog.csdn.net/questionfish/article/details/46739207中的一个部分,如下:
需要注意的是,上面的语料库整个作为一个Python List存在了内存中。在这个简单的例子中,这当然无关紧要。但是我们因该清楚,假设我们有一个百万数量级文档的语料库,我们不可能将整个语料库全部存入内存。假设这些文档存在一个硬盘上的文件中,每行一篇文档。Gemsim仅要求一个语料库可以每次返回一个文档向量:
请在这里下载示例文件
这里假设的在一个单独的文件中每个文档占一行不是十分重要;你可以改造 __iter__ 函数来适应你的输入格式,无论你的输入格式是什么样的,例如遍历文件夹、解析XML、访问网络等等。你仅需在每个文档中解析出一个由记号(tokens)组成的干净列表,然后利用dictionary将这些符号转换为其id,最后在__iter__函数中产生一个稀疏向量即可。
现在的语料库是一个对象。我们没有定义任何打印它的方法,所以仅能打印该对象在内存中的地址,对我们没什么帮助。为了查看向量的组成,让我们通过迭代的方式取出语料库中的每个文档向量(一次一个)并打印: 虽然输出与普通的Python List一样,但是现在的语料库对内存更加友好,因为一次最多只有一个向量寄存于内存中。你的语料库现在可以想多大就多大啦!
现在的语料库是一个对象。我们没有定义任何打印它的方法,所以仅能打印该对象在内存中的地址,对我们没什么帮助。为了查看向量的组成,让我们通过迭代的方式取出语料库中的每个文档向量(一次一个)并打印: 虽然输出与普通的Python List一样,但是现在的语料库对内存更加友好,因为一次最多只有一个向量寄存于内存中。你的语料库现在可以想多大就多大啦!
更深刻的理解参考:
彻底理解Python中的yield