1

私は、このようにアクティブ化できる固定長 (今のところ) ブルート フォース ジェネレーターを作成する方法を見つけようとしています。

for i in FixedLength('abc', 3):
    print(i);

i の値はジェネレータであってはなりません。これは私が持っているものです:

import sys;
class FixedLength:  
    def __init__(self, charset, length, code_page=sys.getdefaultencoding())
        self.length=length;
        self.code_page=code_page;
        #basically
        self.charset=bytes(charset, code_page);
        self.retval=[charset[0]]*length;

    def __iter__(self):
        return self;

    def __next__(self):
        #problem line 1
        self.recurse(0);
        raise StopIteration;

    def recurse(self, recursion_level):
        if recursion_level==self.length-1:
            for char in self.charset:
                self.retval[recursion_level]=char;
                if self.validate():
                    #problem line 2
                    yield self.output();
        else:
            for char in self.charset:
                self.retval[recursion_level]=char;
                self.recurse(recursion_level+1);
    def validate(self):
        return True;
    def output(self):
        return bytes(self.retval).decode(self.code_page);

(問題の2行目から)出力がうまく印刷されることはわかっていますが、同じ情報を得ることができません。降伏問題の行 1 は、ジェネレーターをジェネレーターにパックします。問題の行 1 を返しても、StopIteration エラーが発生しないため、機能しません。しかし、それを除けば、実際には再帰していないようです。ただし、self.recurse を繰り返し呼び出しますが、再帰レベルは 0 のままです。

4

1 に答える 1

0

あなたrecurseはジェネレーター関数です。呼び出されると、シーケンスが生成されます。シーケンスの次の値を返したい場合は、 :__next__から次の値を取得する必要があります。recurse

def __next__(self):
    next(self.recurse(0))

ビルトインnext()StopIteration例外を発生させます。

ただし、デザインは少し混乱しています。これは、ジェネレーターと同様の実装の試みを組み合わせたものです。つまり、あるジェネレーターを別のジェネレーターにラップしているということです。または、イテレータを再帰的に実装していますが、これは奇妙なことです。または私は混乱しています。意図は何ですか?おそらくもっと簡単な方法で実装できます。

于 2012-05-23T06:42:30.080 に答える