1. ホーム
  2. python

[解決済み] len(generator())の方法 [重複している]

2022-04-23 21:35:56

質問

Pythonジェネレータ はとても便利です。リストを返す関数よりも利点があります。しかし len(list_returning_function()) . という方法はないのでしょうか? len(generator_function()) ?

UPDATE

もちろん len(list(generator_function())) はうまくいくのですが......。

私が作成したジェネレータを、新しく作成するジェネレータの内部で使用しようとしています。新しいジェネレーターの計算の一部として、古いジェネレーターの長さを知っておく必要があります。しかし、私は、ジェネレータとして同じプロパティを持つ両者を一緒に保持したいと思います。 非常に が長い。

UPDATE 2:

ジェネレータを想定 は知っている は、最初のステップからターゲットの長さがわかっています。また、このままでは len() の構文があります。例:Pythonの関数がオブジェクトなら、このオブジェクトの変数に長さを代入して、新しいジェネレータからアクセスできるようにできないでしょうか?

どのように解決するのですか?

ジェネレーターは長さを持たない。結局のところ、コレクションではない。

ジェネレータは 内部状態を持つ関数 (そして派手な構文)。繰り返し呼び出して一連の値を得ることができるので、ループ内で使用することができます。しかし、ジェネレータには要素がないので、ジェネレータの長さを求めるのは、関数の長さを求めるのと同じです。

<ブロッククオート

Pythonの関数がオブジェクトなら、その長さは このオブジェクトの変数には、新しいジェネレータからアクセスできるのでしょうか?

関数はオブジェクトですが、新しい属性を割り当てることはできません。その理由は、このような基本的なオブジェクトをできるだけ効率的に維持するためでしょう。

しかし、単純に (generator, length) のペアを関数から取得したり、ジェネレータをこのような単純なオブジェクトでラップしたりします。

class GeneratorLen(object):
    def __init__(self, gen, length):
        self.gen = gen
        self.length = length

    def __len__(self): 
        return self.length

    def __iter__(self):
        return self.gen

g = some_generator()
h = GeneratorLen(g, 1)
print len(h), list(h)