1

私はPythonコードでこれを頻繁に行っているようです(そうすべきかどうかはおそらく別のトピックです):

the_list = get_list_generator() 
#So `the_list` is a generator object right now

#Iterate the generator pulling the list into memory
the_list = list(the_list) 

算術代入を行うとき、次のような省略形があります...

the_number += 1

したがって、割り当てに関数を使用するときに同じ速記を実現する方法はありますか。これを行うビルトインがあるのか​​ 、カスタム演算子を定義する必要があるのか​​ (私はそれをやったことがありません)、または最終的によりクリーンなコードにつながる他の方法があるのか​​ どうかはわかりません(使用することを約束しますジェネリック型キャストの場合)。

#Maybe using a custom operator ?
the_list @= list()
#Same as above, `the_list` was a generator, but is a list after this line

編集::

私は最初に言及しませんでした: これは、インタラクティブ モードで最も頻繁に発生します (したがって、必要な入力を減らしたい理由です)。iterator のインデックスを作成しようとしてgen_obj[3]、エラーが発生したら、それをキャストする必要があります。

示唆されているように、これはおそらく最高ですが、最終的には私が探しているものではありません.

the_list = list(get_list_generator())
4

3 に答える 3

1

イテレータをリストに変換するための構文上のショートカットはありません。なので、ただ走るlist(it)のが普段の練習です。

結果の検査のみが必要な場合は、itertools モジュールのtake()レシピを使用します。

def take(n, iterable):
    "Return first n items of the iterable as a list"
     return list(islice(iterable, n))

このレシピは、基礎となる反復子が長い、無限、または計算コストが高い場合に特にうまく機能します。

于 2013-04-28T20:25:41.447 に答える
1

多分あなたは別の方法で行くことができます:

を返したいジェネレーター関数がある場合はlist、それを装飾できます。

def apply(after):
    import functools
    "Apply a function to the result of a function call."
    def decorator(func):
        @wraps(func)
        def wrapper(*a, **k):
            return after(func(*a, **k))
        return wrapper
    return decorator

この関数を取得したら、次のように使用できます。

@apply(list)
def get_list_generator(n):
    yield n

l = get_list_generator(12)
于 2013-04-28T20:50:29.187 に答える