2016-05-03 85 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

公平点。我一直使用太多的协程,现在我无法停下来! –