博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python yield generator
阅读量:5788 次
发布时间:2019-06-18

本文共 1376 字,大约阅读时间需要 4 分钟。

, Python yield 使用浅析

这篇说的很清楚

主要看到FP里面的Lazy Seq概念, 所以想起这个...

 

包含yield函数就是生成器(generator) 

什么是生成器, 用于产生迭代器(iterator), 有什么用?

在python里面任何迭代器都可以用list comprehension, 当list来处理

但是对于很大的list和无限list, 你肯定不能事先把list生成出来, 所以我只想在用的时候再去生成...Lazy Sequence的概念

那么yield就是用来方便定义这样的迭代器, 看个Fibonacci的例子.

这个逻辑很简单, 如果你想要这个list, 可以将b append到list里面返回. 问题是这个不是lazy的, 必须执行完才能得到完整的list. 

如果list很大, memory可能是issue, 有时也许我只需要前几个...总之就是不灵活

def fab(max):     n, a, b = 0, 0, 1     while n < max:         print b         a, b = b, a + b         n = n + 1

 

为了灵活, 我们生成个迭代器,这样使用起来就很方便, 可以用for, 也可以手动的next, 需要几个取几个

问题是, 这个代码实现和上面比很复杂, 可以用上面简单的code实现迭代器吗?

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 = self.n + 1             return r         raise StopIteration()
 
>>> for n in Fab(5):  ...     print n  ...  1  1  2  3  5

ok, yield登场, 只需要把print换成yield就实现了, 是不是很easy

def fab(max):     n, a, b = 0, 0, 1     while n < max:         yield b         # print b         a, b = b, a + b         n = n + 1

>>> f = fab(5)  >>> f.next()  1  >>> f.next()  1  >>> f.next()  2

这个可以用于任何lazy sequence的场景, list和内容非常多, 我想一部分一部分取, 比如读个很大的文件, 或其他的IO, 都可以使用.

本文章摘自博客园,原文发布日期: 2013-02-08

转载地址:http://meqyx.baihongyu.com/

你可能感兴趣的文章
typedef BOOL(WINAPI *MYFUNC) (HWND,COLORREF,BYTE,DWORD);语句的理解
查看>>
jsp 特殊标签
查看>>
[BZOJ] 1012 [JSOI2008]最大数maxnumber
查看>>
gauss消元
查看>>
多线程-ReentrantLock
查看>>
数据结构之链表与哈希表
查看>>
IIS7/8下提示 HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求...
查看>>
http返回状态码含义
查看>>
响应式网站对百度友好关键
查看>>
洛谷P2179 骑行川藏
查看>>
(十八)js控制台方法
查看>>
VB关键字总结
查看>>
android代码生成jar包并混淆
查看>>
一个不错的vue项目
查看>>
屏蔽指定IP访问网站
查看>>
python学习 第一天
查看>>
根据毫秒数计算出当前的“年/月/日/时/分/秒/星期”并不是件容易的事
查看>>
python的图形模块PIL小记
查看>>
shell变量子串
查看>>
iOS的主要框架介绍 (转载)
查看>>