3

私はプログラミングを始めたばかりで、Python を使って数か月になります。私は Stackless で動作する概念を取得しようとしていますが、方法がわかりません (ただし、Stackless で動作する他のテスト スクリプトを作成しました)。

Anywho、煮詰めた例として、リストを実行し、同じ関数を再帰的に呼び出すことによって、リストのすべての順列 (編集: 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]

これまでのところ、スタックレスと再帰で見つけた唯一の例は、関数がすべて完了した後に関数の最後に情報を送信しているようです。上記で必要となるように、for ループの途中では使用しないでください。

一体どうやってこれを行うのでしょうか?これを再帰関数ではなくタスクレットで実行するスクリプトにするにはどうすればよいでしょうか? (このバージョンは私が思いつく最高のものですが、どのように配置しても失敗します。これは多くの試みの 1 つです。この時点でスパゲッティを壁に投げつけたほうがよいかもしれません。)

バウンスバック関数なしでそれを行う方法のためのボーナス e-cookie - 1 つのタスクレットを使用せずに、1 つのタスクレットに複数回情報を渡す方法をまだ見つけることができませんでした。

御時間ありがとうございます!

4

2 に答える 2

1

あなたは「ジェネレーター」(つまり「yield」pythonキーワード)を研究したいと思います。基本的に、ジェネレーターを使用すると、関数呼び出しの途中で一時停止して、結果を返すことができます。関数が再び「呼び出される」と、「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)では、「inmyGen」がリストの印刷と交互に印刷されることに注意してください。ただし、myFnでは、もちろん「inmyFn」が最初に出力されます。

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
于 2011-06-21T02:13:02.120 に答える
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を使用することもできます。

于 2011-07-25T13:04:11.533 に答える