2014-04-18 32 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