设为首页 收藏本站
查看: 608|回复: 0

[经验分享] Yield in Python/Ruby

[复制链接]

尚未签到

发表于 2017-5-1 10:38:04 | 显示全部楼层 |阅读模式
Yield in Python/Ruby - Iterator/Visitor

首先,我们从Ruby的Iterator开始。Ruby程序员可以用yield关键字定义Iterator。例如,下面的abc()就是一个Iterator。

def abc()
yield “a”
yield “b”
yield “c”
end

abc Iterator的调用方法如下:

# block形式
abc do | ch |
print ch
end

或者
# closure形式
abc { | ch | print ch }

从这个调用方式,我们可以看出,实际上,Ruby Iterator并不是真正的Iterator,而是一个Visitor。Yield其实只是一个占位符。上述Ruby Iterator代码的真实含义如下:

def abc( visitor )
visitor.visit( “a” )
visitor.visit( “b” )
visitor.visit( “c” )
end

调用方法为

class Printer
def visit( ch )
print ch
end
end

abc( Printer.new )

我们看到,Ruby “Yield” Iterator只是一种虚拟Iterator,虽然貌似Iterator,其实却是Visitor。我们无法中途中断abc()的执行。只能从头到尾打印出abc。
Python “Yield” Iterator是真正的Iterator,例如:

def abc() :
yield “a”
yield “b”
yield “c”

调用方法为

for ch in abc()
if ch == “b”
break
print ch

我们看到,abc()确实返回了一个Iterator,而且我们可以中途中断程序,只打印出ab。
Python Iterator是采用coroutine实现的。
Coroutine表示几个协同工作的程序。比如,消费者/生产者,你走几步,我走几步;下棋对弈,你一步我一步。人们就很容易想到用Coroutine来实现Iterator。
这里面Iterator就是Coroutine里面的生产者Producer角色,数据提供者。所以,也叫做Generator。
每次Iterator程序就是等在那里,一旦用户(消费者Consumer角色)调用了iterator.next, Iterator就继续向下执行一步,然后把当前遇到的内部数据的Node放到一个消费者用户能够看到的公用的缓冲区(比如,直接放到消费者线程栈里面的局部变量)里面,然后自己就停下来(wait)。然后消费者用户就从缓冲区里面获得了那个Node。
这样Iterator就可以自顾自地进行递归运算,不需要自己管理一个栈,而是迫使计算机帮助它分配和管理运行栈。

Python “Yield” Iterator可以实现无限数据的Iterator。
def infinite()
n = 1
while true
yield n
n = n + 1

调用方法
for i in infinit()
if i > 100
break

print i

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-371540-1-1.html 上篇帖子: Ruby 1.9不会杀死Python   转 下篇帖子: 浅尝Python Web 框架:Django
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表