myhdl 中的 yield 语句
yield statement in myhdl
我的myhdl环境中有如下代码:
def rst(self):
rst.next=rst.active
self.wait_clks(5)
def wait_clks(self, cycles):
for _ in range(cycles):
yield self.clk.posedge
上面的代码不起作用,但是当我用下面的代码替换它时它起作用了:
def rst(self):
rst.next=rst.active
for _ in range(5):
yield self.clk.posedge
我对此感到困惑,是否有人可以解释为什么函数定义中的 yield 不起作用?
当你简单地调用一个 generator function
(一个在其主体中有 yield 语句的)时,你会得到一个生成器对象,它甚至不会在那个时候开始通过函数,它只会在您开始迭代 returned 生成器对象(或对其调用 next()
)。示例 -
>>> def gen1():
... print("Starting")
... for i in range(10):
... yield i
...
>>> g = gen1()
>>> g
<generator object gen1 at 0x00273E68>
正如您在上面看到的,它并没有开始遍历函数,它只是 returned 生成器对象。要完成该函数,您需要迭代 g
或对其调用 next()
。示例 -
>>> g.next()
Starting
0
>>> for i in g:
... print i
...
1
2
.
.
在您的第一种情况下也发生了类似的事情,您只是调用生成器函数,return生成器对象,然后丢弃结果。最有可能的是,从任何调用 rst()
的地方,它都期待 return 中的生成器对象。在这种情况下你的第二种方法是最好的。
但是如果你真的真的想在一个单独的函数中制作它(我认为没有必要在一个单独的方法中制作它),你可以直接 return [=19= 的结果] 从 rst(self)
回来。示例 -
def rst(self):
rst.next=reset.active
return self.wait_clks(5)
显示此方法有效的示例 -
>>> def f():
... return gen1()
...
>>> for i in f():
... print(i)
...
Starting
0
1
2
.
.
正如 Anand 所描述的,您不能简单地调用生成器,在这种情况下,如果您生成生成器,您将得到您期望的结果
def rst(self):
rst.next=rst.active
yield self.wait_clks(5)
我的myhdl环境中有如下代码:
def rst(self):
rst.next=rst.active
self.wait_clks(5)
def wait_clks(self, cycles):
for _ in range(cycles):
yield self.clk.posedge
上面的代码不起作用,但是当我用下面的代码替换它时它起作用了:
def rst(self):
rst.next=rst.active
for _ in range(5):
yield self.clk.posedge
我对此感到困惑,是否有人可以解释为什么函数定义中的 yield 不起作用?
当你简单地调用一个 generator function
(一个在其主体中有 yield 语句的)时,你会得到一个生成器对象,它甚至不会在那个时候开始通过函数,它只会在您开始迭代 returned 生成器对象(或对其调用 next()
)。示例 -
>>> def gen1():
... print("Starting")
... for i in range(10):
... yield i
...
>>> g = gen1()
>>> g
<generator object gen1 at 0x00273E68>
正如您在上面看到的,它并没有开始遍历函数,它只是 returned 生成器对象。要完成该函数,您需要迭代 g
或对其调用 next()
。示例 -
>>> g.next()
Starting
0
>>> for i in g:
... print i
...
1
2
.
.
在您的第一种情况下也发生了类似的事情,您只是调用生成器函数,return生成器对象,然后丢弃结果。最有可能的是,从任何调用 rst()
的地方,它都期待 return 中的生成器对象。在这种情况下你的第二种方法是最好的。
但是如果你真的真的想在一个单独的函数中制作它(我认为没有必要在一个单独的方法中制作它),你可以直接 return [=19= 的结果] 从 rst(self)
回来。示例 -
def rst(self):
rst.next=reset.active
return self.wait_clks(5)
显示此方法有效的示例 -
>>> def f():
... return gen1()
...
>>> for i in f():
... print(i)
...
Starting
0
1
2
.
.
正如 Anand 所描述的,您不能简单地调用生成器,在这种情况下,如果您生成生成器,您将得到您期望的结果
def rst(self):
rst.next=rst.active
yield self.wait_clks(5)