list型とgenarator型

「入門自然言語処理」12章を読み進めております。

p.476にて、sum(len(w) for w in genpaku.words())という文にどうも違和感が。w for w in text みたいな構文はだいぶ見慣れてきましたが、[]で必ず左右を囲み、[w.lower() for w in text1]のようにしてlistの各要素に何らかの操作を施したlistを得る、っていう使い方じゃなきゃったけ?普通のカッコ()で囲まれている。。

しばし調べると

(len(w) for w in genpaku.words())はgeneratorクラス
[len(w) for w in genpaku.words()]はもちろんlistクラス

とこれらは別物です。

今の自分のレベルの理解では、generatorクラスとは、リストに似たリストもどきのようなもので、
sum(len(w) for w in genpaku.words())のように、複数の引数を取るsum等のメソッドと一緒に使うもの、と捉えました。

そういえばjoinの引数としてこのforの構文が出てきたときもたしかカッコ囲みのgeneratorクラスだったような、というかそうだ。

ちなみにsumやjoinは、generator,listクラスどちらでも引数に取ることもできるようです。

>>> ' '.join([n for n in ['a','b','c']]) #listクラスが引数
'a b c'
>>> ' '.join(n for n in ['a','b','c']) #generatorクラスが引数
'a b c'

下の方がすっきりしてます。