ジェネレーター式ではなく、リスト内包表記について話している。
for ループを交換する必要があります。
[ x for y in range(3) for x in range(y) ]
これらは、通常のループにネストされているかのように読み取る必要があります。
for y in range(3):
for x in range(y):
x
複数のループを含むリスト内包表記は、同じ順序に従います。リスト内包表記のドキュメントを参照してください:
リスト内包表記が指定されている場合、単一の式の後に少なくとも 1 つのfor
句とゼロ個以上のfor
orif
句が続きます。この場合、新しいリストの要素は、各for
orif
句をブロックと見なし、左から右にネストし、最も内側のブロックに到達するたびに式を評価してリスト要素を生成することによって生成される要素です。
もちろん、同じことがジェネレーター式にも当てはまりますが、これら()
は角括弧の代わりに括弧を使用しており、すぐには具体化されません。
>>> (x for y in range(3) for x in range(y))
<generator object <genexpr> at 0x100b50410>
>>> [x for y in range(3) for x in range(y)]
[0, 0, 1]