2014-04-18 33 views
0

如何创建/调用元史巨蟒发电机?这甚至有可能吗?元史和Python发电机(收益率)

例如,(并且没有我不是寻找一个备用的解决这个问题,其中有很多,包括列举在每个等):

<?python 
    """ a bunch of other code ... """ 
    def bg_color_gen(): 
    """ Alternate background color every call """ 
    while 1: 
     yield "#FFFFFF" 
     yield "#EBEBEB" 
    ?> 

,然后调用这功能:

<fo:block background-color="${bg_color_gen()}">First entry</fo:block> 
    <fo:block background-color="${bg_color_gen()}">Second entry</fo:block> 
    <fo:block background-color="${bg_color_gen()}">Third entry</fo:block> 

这有什么与我< FO:段>,您可以用< DIV>更换。这不是一个FO问题,而是一个Genshi问题。 我猜元史不承认“产量”和奔跑“而1”的广告,无限?

另外,我知道我可以使用全局跟踪计数器,然后调用

counter++ 
if counter%yieldCount==0: return "#FFFFFFF" 
elif counter%yieldCount==1: return "#EBEBEB" 

但是,这不是一台发电机,并很快得到难看!

澄清: 另一种方式来问这个问题:你会如何代码

def fib(): 
    a,b = 0,1 
    while True: 
     yield a 
     b = a+b 
     yield b 
     a = a+b 

这将随后在句子“第一个数字是$ FIB()被调用,第二个是$ FIB() ,第三个是$ fib()等等。“

============================================== ==基于公认的答案

更新完整的解决方案:

<?python 
def fib_generator(): 
    a,b = 0,1 
    while True: 
     yield a 
     b = a+b 
     yield b 
     a = a+b 
fib = fib_generator() 
?> 


The first number is ${next(fib)}, 
the second is ${next(fib)}, 
the third is ${next(fib)}, and so on. 
+0

什么代替“第一”,“第二”和“第三”项的使用呢?这是动态还是真的是你将使用的文本? –

+0

这个问题应该没有关系。但它可以完全一样或内部的for循环,打印了一堆行,其中一些人有自己的背景颜色,我们不希望中断/复位的交替颜色。 基本上,这里唯一的问题是我如何获得发电机。 ...如何$ {fibonnaci()} $ {fibonnaci()} $ {fibonnaci()}例如 –

回答

1

不知道你的内容的结构,我建议如下:

<fo:block py:for="i, entry in entries" 
      background-color="${'#FFFFFF' if i % 2 else '#EBEBEB'}"> 
    ${entry} 
</fo:block> 

但是,如果你真的想使用发电机,那么你可以只评估使用Python的原生next()

<py:with vars="color=bg_color_gen();"> 
    <fo:block background-color="${next(color)}"> 
</py:with> 
+0

的原因,你的第一反应是行不通的是,我在里面一个for循环已经和一些条目不要在别人显示时显示。然而,您的第二个解决方案能够简洁地回答我的问题! –

+0

确定NP,我愿意相信,但我建议,除了'py:if'和'py:strip'外,几乎总是可以循环使用我的第一个建议。如果您充分利用它的所有功能,Genshi可以非常强大:) –

1

您想要先声明发电机,然后在其上呼叫next以获得yield ed颜色。

在这种情况下,你是通过发电机的三种不同的情况下,通过调用bg_color_gen() IE)创建

# this creates a generator 
>>> bg_color_gen() 
<generator object bg_color_gen at 0x02B21A30> 
>>> bgcg = bg_color_gen() 
# this gets values 
>>> next(bgcg) 
'#FFFFFF' 
>>> next(bgcg) 
'#EBEBEB' 
>>> next(bgcg) 
'#FFFFFF' 
>>> 
+1

谢谢您的解释,它显示了我错在哪里。我接受了另一个答案,因为它告诉我如何准确地做到这一点,但你的回答解释了它的原因(对我而言同样重要),这很简单! –

+0

@ Pierre-Francoys Brousseau不成问题。 – flakes