2016-05-03 88 views
0

我一直在試圖讓我的代碼更pythonic,並想知道是否有辦法以某種方式使這一行。在Python中遞歸地擴展列表

w=[1, 0, 0, 0, 0, 0, 0, 0] # just an example 
for i in range(170): 
    w.append(w[-2]^w[-3]^w[-4]^w[-8]) 

我試圖用拉姆達符號,得到了這一點,但它並不適用於長度大於50左右

[(lambda a:lambda v:a(a,v))(lambda s,x:1 if x==0 else (0 if x < 8 else s(s,x-2)^s(s,x-3)^s(s,x-4)^s(s, x-8)))(k) for k in range(170)] 

我也試圖與列表遞歸工作:

(lambda n: (lambda f, n: f(f, n))(lambda f, n: f(f, n-1)+[f(f, n-1)[-2]^f(f, n-1)[-3]^f(f, n-1)[-4]^f(f, n-1)[-8]] if n > 0 else [1,0,0,0,0,0,0,0], n))(20) 

我想這些都可以與memoization一起使用,但我不確定如何儘可能地以內聯方式進行操作。

+2

你到底做的,到底是什麼? – timgeb

+9

第一個版本更清晰,*方式*更具可讀性。使它成爲單線程將*不*使它更pythonic - 它會讓它變得一團糟... – alfasin

+0

@timgeb我試圖計算一個哈希算法圓常數 –

回答

0

我覺得你有什麼是好的,但也許把它變成像一個發電機:

def running_xor(w, n): 
    for i in range(n): 
     yield w[-2]^w[-3]^w[-4]^w[-8] 

w.extend(running_xor(w, 170)) 
+1

我建議不要這樣做,因爲它會使執行順序不太清晰。例如,人們必須記住,slice-assignment在執行任何事情之前都會運行generator來完成,而'extend'會在添加下一個元素之前添加每個元素。 – user2357112

+0

公平點。我一直使用太多的協程,現在我無法停下來! –