37

私はforブロックコードのコンテキストでのループに精通しています。例えば:

for c in "word":
    print c

使用方法が異なるいくつかの例に出くわしましたfor。ステートメントで開始するのではなくfor、式の最後でタグを付けます(インデントされたコードブロックは含まれません)。例えば:

sum(x*x for x in range(10))

誰かが私にこの使用法を概説するいくつかの文書を指摘できますforか?例は見つかりましたが、説明は見つかりませんでした。for私が見つけたすべてのドキュメントは、以前の使用法を説明しています(ブロックコードの例)。この使用法を何と呼ぶか​​さえわからないので、質問のタイトルが不明な場合はお詫び申し上げます。

4

4 に答える 4

31

あなたが指しているGeneratorのはPythonです。を見てみましょう: -

ドキュメントを参照してください:-Generator Expression投稿したものとまったく同じ例が含まれています

ドキュメントから:-

ジェネレーターは、イテレーターを作成するためのシンプルで強力なツールです。これらは通常の関数のように記述されていますが、データを返したいときはいつでもyieldステートメントを使用します。next()が呼び出されるたびに、ジェネレーターは中断したところから再開します(すべてのデータ値と最後に実行されたステートメントを記憶します)

ジェネレータは、の代わりにList Comprehension使用するものと似ていますが、メモリ効率が高くなります。同時に結果の完全なものを返すことはありませんが、ジェネレーターオブジェクトを返します。オブジェクトを呼び出すたびに、ジェネレータは次の値を返すために使用します。square bracketsbracketslistnext()generatoryield

List Comprehension上記のコードは次のようになります:-

[x * x for x in range(10)]

forの最後に結果を除外する条件を追加することもできます。

[x * x for x in range(10) if x % 2 != 0]

numbers数値が2で割り切れない場合、これは1から5の範囲で2を掛けたリストを返します。

Generatorsの使用を描写する例は次のyieldとおりです。

def city_generator():
    yield("Konstanz")
    yield("Zurich")
    yield("Schaffhausen")
    yield("Stuttgart")

>>> x = city_generator()
>>> x.next()
Konstanz
>>> x.next()
Zurich
>>> x.next()
Schaffhausen
>>> x.next()
Stuttgart
>>> x.next()
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
StopIteration

つまり、へのすべての呼び出しがで次を実行next()することがわかります。そして最後にそれは投げます。yield()generatorStopIteration

于 2012-10-16T17:27:41.083 に答える
9

それらはジェネレータ式であり、リスト内包に関連しています

リスト内包表記を使用すると、リストを簡単に作成できます。たとえば、完全な正方形のリストを作成したい場合は、次のようにすることができます。

>>> squares = []
>>> for x in range(10):
...     squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

ただし、代わりにリスト内包表記を使用できます。

squares = [x**2 for x in range(10)]

ジェネレータ式はリスト内包表記に似ていますが、リストではなくジェネレータオブジェクトを返す点が異なります。リスト内包表記と同様の方法でこのジェネレータオブジェクトを反復処理できますが、リスト内包表記でリストを作成した場合のように、リスト全体を一度にメモリに保存する必要はありません。

于 2012-10-16T17:35:44.607 に答える
0

あなたの特定の例はジェネレータ式と呼ばれます。リスト内包表記、辞書内包表記、およびセット内包表記は、意味が似ており(異なる結果タイプ、ジェネレータ式は怠惰です)、構文は同じです。モジュロは他の種類の括弧内にあり、辞書内包表記の場合はexpr1: expr2、単一の式(この例ではx * x)。

于 2012-10-16T17:30:44.300 に答える
0

ジェネレータ式のドキュメントはこちらhttps://www.python.org/dev/peps/pep-0289/ ジェネレータ式を使用したコードは次のとおりです。

list(x**2 for x in range(0,10))
于 2018-04-01T06:24:11.497 に答える