在Ruby中,yield关键字用于向执行块的闭包屈服。
在Python语言中,这个关键字有所不同吗?
在Python语言中,这个关键字有所不同吗?
def do_stuff(val)
puts "Started executing do_stuff"
yield(val+3)
yield(val+4)
puts "Finshed executing do_stuff"
end
do_stuff(10) {|x| puts x+3} #<= This is a block, which is an anonymous function
#that is passed as an additional argument to the
#method do_stuff
--output:--
Started executing do_stuff
16
17
Finshed executing do_stuff
在Python中,当您在函数定义内部看到yield时,这意味着该函数是一个生成器
。生成器是一种特殊类型的函数,可以在执行过程中停止并重新启动。以下是一个示例:
def do_stuff(val):
print("Started execution of do_stuff()")
yield val + 3
print("Line after 'yield val + 3'")
yield val + 4
print("Line after 'yield val + 4'")
print("Finished executing do_stuff()")
my_gen = do_stuff(10)
val = next(my_gen)
print("--received {} from generator".format(val))
输出:
Started execution of do_stuff()
--received 13 from generator
更多代码:
val = next(my_gen)
print("--received {} from generator".format(val))
输出:
Line after 'yield val + 3'
--received 14 from generator
从输出结果可以看出,yield
导致返回一个结果;然后立即停止执行。当你再次在生成器上调用next()时,执行将继续,直到遇到下一个 yield 语句,该语句返回一个值,然后执行再次停止。
yield
关键字相当于Ruby中的Enumerator::Yielder#yield
。 - Jörg W MittagEnumerator::Yielder
和 Enumerator::Generator
的更多细节,我建议参考:http://patshaughnessy.net/2013/4/3/ruby-2-0-works-hard-so-you-can-be-lazy - Alex Moore-Niemiyield args
,您可以向块传递参数,并且使用lvar = yield
可以在控制退出块后将其绑定到lvar。这是Ruby中更通用和一致的特性设计。当然,您也可以将此想法应用于对集合进行迭代。from contextlib import contextmanager
@contextmanager
def openfile(name, mode):
f= open(name, mode)
yield f
f.close()
with openfile('log.txt', 'r') as handle:
for line in handle:
print line