Python 产量对比 Ruby 产量
Python yield vs Ruby yield
在 Ruby 中,yield 关键字用于屈服于执行块的闭包。
此关键字在 Python 语言中有何不同?
在ruby中,yield是调用匿名函数的快捷方式。 Ruby 具有将匿名函数传递给方法的特殊语法;该语法称为 block
。因为函数没有名字,所以你用名字yield来调用函数:
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 时,表示该函数是 generator
。生成器是一种特殊类型的函数,可以在执行过程中停止并重新启动。这是一个例子:
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 语句,returns 一个值,然后执行再次停止。
在Ruby中,yield用于将控制弹跳到块(类似于匿名函数)以执行块的语句,然后弹回调用块的位置。
使用 yield args
可以将参数传递给块,也可以使用 lvar = yield
在控制退出块后,您可以获得返回的任何内容并将其绑定到 lvar 。这是 Ruby 中非常通用且一致的功能设计。而且当然,
您可以将此想法应用于遍历集合。
而在 Python 中,大多数人使用 yield 来促进有效访问项目而不是某种集合,他们专注于 迭代一次并生成苍蝇曾经被称为的idea,这就是yield在Python.
中的主要用途
仅供参考,在 yield 上,Python 和 Ruby 之间的区别不是很大,至少在使用它的方式上是这样。 (显然它们的实现方式不同,至于 python,yield 创建一个生成器,除非迭代开始,否则不会 运行 任何代码)。例如, yield 在 python contextmanager 中的使用方式在 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
这里,yield将file句柄传给with,执行with-statements 恰好 一次 然后反弹回文件关闭语句
在 Ruby 中,yield 关键字用于屈服于执行块的闭包。
此关键字在 Python 语言中有何不同?
在ruby中,yield是调用匿名函数的快捷方式。 Ruby 具有将匿名函数传递给方法的特殊语法;该语法称为 block
。因为函数没有名字,所以你用名字yield来调用函数:
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 时,表示该函数是 generator
。生成器是一种特殊类型的函数,可以在执行过程中停止并重新启动。这是一个例子:
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 语句,returns 一个值,然后执行再次停止。
在Ruby中,yield用于将控制弹跳到块(类似于匿名函数)以执行块的语句,然后弹回调用块的位置。
使用 yield args
可以将参数传递给块,也可以使用 lvar = yield
在控制退出块后,您可以获得返回的任何内容并将其绑定到 lvar 。这是 Ruby 中非常通用且一致的功能设计。而且当然,
您可以将此想法应用于遍历集合。
而在 Python 中,大多数人使用 yield 来促进有效访问项目而不是某种集合,他们专注于 迭代一次并生成苍蝇曾经被称为的idea,这就是yield在Python.
中的主要用途仅供参考,在 yield 上,Python 和 Ruby 之间的区别不是很大,至少在使用它的方式上是这样。 (显然它们的实现方式不同,至于 python,yield 创建一个生成器,除非迭代开始,否则不会 运行 任何代码)。例如, yield 在 python contextmanager 中的使用方式在 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
这里,yield将file句柄传给with,执行with-statements 恰好 一次 然后反弹回文件关闭语句