MyHDL 正在使用该yield语句来传达一系列条件,当其中一个条件为 时True,将恢复生成器的执行。例如,clock.posedge当时钟从低电平转换为高电平(0 到 1)时,发生器可能会产生条件——当时钟进行此转换时,发生器将恢复。
为了(大致)模拟它是如何工作的,这里有一个 Python 生成器,当它的一个条件(参数可以被 3 或 7 整除)被满足时,它会被恢复:
def process():
j = 0
while True:
yield (lambda x: x % 3 == 0, lambda x: x % 7 == 0)
j += 1
print 'process j=', j
gen = process()
conds = next(gen)
for i in range(1, 11):
print 'i=', i
if any(cond(i) for cond in conds):
conds = next(gen)
输出:
i= 1
i= 2
i= 3
process j= 1
i= 4
i= 5
i= 6
process j= 2
i= 7
process j= 3
i= 8
i= 9
process j= 4
i= 10
更新- 关于我使用的一些语法的更多细节:
我倾向于使用 [ next(gen, [default])] 函数,因为它比调用更灵活gen.next()。例如,如果您传递defaultarg,当生成器耗尽时,它将返回default而不是raiseStopIteration。
varconds指向一个包含条件的元组。在上面的这个例子中,它指向一个包含 2 个lambda 匿名函数的元组。process
语法:
if any(cond(i) for cond in conds):
conds = next(gen)
调用any内置函数,传递给它一个循环并计算的生成器表达式。它是写作的简写:condsif cond(i) is True
for cond in conds:
if cond(i):
conds = next(gen)
break