4

私は python-3.2.3 64bit を使用していますが、奇妙な動作が見られます。

インタープリターを使用する場合の例: 入力

>>> range(10)

出力の結果

range(0, 10)

いつ印刷するか

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

類似入力

>>> l = range(10)
>>> f = filter( lambda x: x<2, l)
>>> f

アウトプットにつながる

<filter object at 0x00000000033481D0>

しかし、そうあるべきです

[0, 1]

明らかに、私はそのオブジェクトで何もできません:

>>>> len(f)
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    len(f)
TypeError: object of type 'filter' has no len()

ここで何が問題なのですか?

4

2 に答える 2

18

何も問題はありません。range()Py3.x は、ジェネレーターのように一度に 1 つの項目を生成しますが、Py2.x の動作とは異なり、その場ですぐにリストを生成し、それをユーザーに返します。range(10)への呼び出しを への呼び出しでラップすると、list()期待どおりの結果が得られます。

于 2012-06-07T18:55:25.317 に答える
3

これらの関数は反復子オブジェクトを返します。list(range(0, 10))またはを使用してリストに変換できますlist(f)。次のように結果を反復処理することもできます。

for i in range(0, 10):
    print(i)

最後に、next関数を使用して次のアイテムを取得できます。

l = range(0, 10)
l1 = next(l)
l2 = next(l)

リストの代わりに反復子を返すことで、すべてのアイテムをメモリにロードすることなく、アイテムに対して複雑な操作を実行できます。たとえば、ファイル全体をメモリにロードすることなく、巨大なファイルを反復処理して文字ごとに変換できます。

于 2012-06-07T18:57:49.500 に答える