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在參數清單到了微