一文で書くfor loopとジェネレーターについて


このようにfor loopを1文で書けると思います。

[code]

    l = [i for i in range(5)] # 結果　[0, 1, 2, 3, 4]
    
[/code]

あとは、このようにもできると思います。

[code]

    x = '\n'.join(" "*i + "I" for i in range(n))
    print(x)
    #　結果
    # I
    #  I
    #   I
    #    I
    
[/code]

一番最初のものでlistではなくて、printを連続で行うような処理をしようとしたのですが、プリントできません。

[code]

    print(i for i in range(5))
    # 結果　<generator object <genexpr> at 0x000002A167A4C048>
    
[/code]

なぜ、joinはうまくできているのにprintはできないのでしょうか？




print() の場合は以下のようにします。

[code]

    print(*(i for i in range(5)))                                           
    0 1 2 3 4
    
[/code]

print() は渡されたオブジェクトをそのまま表示するのがその機能なので値を表示したければ値を渡さなければなりません。

[code]

    print(i for i in range(5))
    
[/code]

だと `(i for i in range(5))` というジェネレータが渡されたことを意味します。  
アスタリスクを付けて `*(i for i in range(5))` とすると、ジェネレータをアンパックします(評価した値を渡します)。




print() の場合は以下のようにします。

[code]

    print(*(i for i in range(5)))                                           
    0 1 2 3 4
    
[/code]

print() は渡されたオブジェクトをそのまま表示するのがその機能なので値を表示したければ値を渡さなければなりません。

[code]

    print(i for i in range(5))
    
[/code]

だと `(i for i in range(5))` というジェネレータが渡されたことを意味します。  
アスタリスクを付けて `*(i for i in range(5))` とすると、ジェネレータをアンパックします(評価した値を渡します)。

