洛阳铲的日志

2010年10月13日

yield之py和rb

Filed under: Python,ruby — 标签:, , — HackGou @ 17:56

py和rb里面都有yield, 但是他们的用法却天壤之别:

py中yield用于生成器,引用[1]的话说:

yield 简单说来就是一个生成器,生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

生成器 是 一个函数
函数的所有参数都会保留

第二次调用 此函数 时
使用的参数是前一次保留下的.

生成器还"记住"了它在流控制构造
生成器不仅"记住"了它数据状态。 生成器还"记住"了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。由于连续性使您在执行框架间任意跳转,而不总是返回到直接调用者的上下文(如同生成器那样),因此它仍是比较一般的。

这是个列子:

>>> def tt(x):
...     print "starting"
...     yield x
...     print "continue"
...     yield x+10
...     print "3th step"
...     yield x*5
... 
>>> i=tt(1)
>>> i.next()
starting
1
>>> i.next()
continue
11
>>> i.next()
3th step
5
>>> i.next()
Traceback (most recent call last):
  File "
", line 1, in 

StopIteration
>>> for k in tt(1): ... print k ... starting 1 continue 11 3th step 5
>>> type(i) <type 'generator'> >>> type(type(i)) <type 'type'> >>> type(tt) <type 'function'> >>>

而rb中,yield却是对传入块的调用,比如:

irb(main):001:0> a=[1,2,3]
=> [1, 2, 3]
irb(main):002:0> def foo
irb(main):003:1> puts "starting"
irb(main):004:1> yield a
irb(main):005:1> puts "finished"
irb(main):006:1> end
irb(main):007:0> a.each do | a1 |
irb(main):008:1* foo(a1) { | x | puts x*x }
irb(main):009:1> end
starting
1
finished
starting
4
finished
starting
9
finished
=> [1, 2, 3]
irb(main):010:0>

可以看出,其实yied a1就是对{|x| puts x*x}的调用,

[1]: 《Python yield 用法》: http://www.pythonclub.org/python-basic/yield

没有评论 »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress