3

我对编程相当陌生,现在我已经用Python工作了几个月。我试图让一个概念与Stackless一起工作,但是却无法弄清楚(虽然我写了other test scripts与Stackless一起工作)。Stackless Python - 递归for循环?

作为一个简化的例子,任何人都应该考虑下面的代码,该代码遍历一个列表,并通过递归调用相同的函数找到它的所有排列(编辑:n维笛卡尔乘积)。

def traverseList(theList,temp,solutions,level=1): 
    if level != len(theList): 
     for x in theList: 
      temp.append(x) 
      traverseList(theList,temp,solutions,level+1) 
      temp.pop() 
    else: 
     for x in theList: 
      temp.append(x) 
      solutions.append(temp[:]) 
      temp.pop() 

myList = ["a",None,2,"gamma",8] #the list doesn't always have just numbers 
solutionList = [] 
tempList = [] 

traverseList(myList,tempList,solutionList) 
print("%s... %s" %(solutionList[0], solutionList[-1])) 

这将产生:

['a', 'a', 'a', 'a', 'a']... [8, 8, 8, 8, 8] 

到目前为止,似乎我找到Stackless的和递归的唯一实例具有的功能在函数结束的信息发送出去这一切都完成之后。从不在for循环的中间,就像上面的那样。

如何赫克我会做到这一点?我将如何将它变成一个脚本,可以使用tasklet而不是递归函数运行? (This version是我能想到的最好的,但是无论我怎么安排它都会失败,这是很多次尝试中的一次,我不妨把意大利面扔在墙上)

Bonus e- cookie的方式来做到这一点没有bounceBack功能 - 我还没有找到一种方法让一个单独的tasklet多次传递信息给自己,没有一个。

谢谢你的时间!

+2

我知道字面上一无所知Stackless的Python,但我觉得我应该做一些轻微的音符。首先,我建议不要使用'main'作为变量名称。其次,它不计算排列,它计算n元素列表的n维笛卡尔乘积。 (一个5元素列表只有120个排列)。第三,[递归](http://en.wikipedia.org/wiki/Recursion_(computer_science))和[concurrency](http://en.wikipedia。 org/wiki/Concurrency_(computer_science))并不完全相同。抱歉,我无法帮助您解决主要问题! – senderle 2011-06-10 03:44:04

+1

对于使用'主',这是有道理的,我会牢记它。至于笛卡尔产品......我不能保证我会记住这个词,但我会尽量记住它们之间的差异。递归与并发之间的差异相同。在教自己的时候很难把所有的单词都讲清楚,但我会尽我所能。谢谢! – squid808 2011-06-10 12:13:41

回答

1

我想你想研究“发电机”(即“产量”蟒蛇关键字)。基本上,一个生成器可以让你在函数调用过程中暂停并返回结果。当函数再次“调用”时,它会在“yield”之后的行恢复。当你终于“返回”你完成了。

下面是一些示例代码为您提供:

def myGen(*x): 
    for elem in x: 
    print "in myGen" 
    yield elem 

def myFn(*x): 
    ret = [] 
    for elem in x: 
    print "in myFn" 
    ret.append(x) 
    return x 


for e in myGen(1,2,3,4,5): 
    print e 

for e in myFn(1,2,3,4,5): 
    print e 

的输出如下。在发电机箱(myGen)中注意,“myGen”中的“与myGen”交替打印列表。但是当然myFn中的“myFn”会先打印出来。

in myGen 
1 
in myGen 
2 
in myGen 
3 
in myGen 
4 
in myGen 
5 
in myFn 
in myFn 
in myFn 
in myFn 
in myFn 
1 
2 
3 
4 
5 
+0

我已经使用过发电机和收益率,但我不明白这对我有多大帮助。是的,发电机可以在收益率之后暂停,直到再次被调用,但这是问题的一部分。为了使Stackless再次调用同一个tasklet,tasklet需要处于自由和倾听的位置。发电机只是暂停,并没有真正接受新的输入。 – squid808 2011-06-21 14:43:11

0

如果我明白你的问题的权利。既然你已经有你的方法到位,堵塞这会工作

import stackless as s 
channel = s.channel() 
s.tasklet(traverseList)(myList,tempList,solutionList) 
s.run() 
print("%s... %s" %(solutionList[0], solutionList[-1])) 

另外,您可以使用* ARGS/** kwargs在参数清单到了微