6

(python3の場合)

python docs では、関数が iterable を取ることがわかります。list()

python docs では、関数がイテレータを取ることもわかります。next()

だから私はIDLEでこれをしました:

>>> var = map(lambda x: x+5, [1,2,3])
>>> var
>>> next(v)
>>> list(v)

出力は次のとおりです。

<map object at 0x000000000375F978>
6
[7,8]

率直に言って、これは私が期待したものではありません。マップオブジェクトはイテレータですか、それともイテラブルですか? 違いはありますか?マップ オブジェクトが何であれ、list()と関数の両方が機能することは明らかです。next()

なぜ両方が機能するのですか?

4

1 に答える 1

19

イテレータはイテラブルですが、イテラブルは必ずしもイテレータではありません。

イテラブルとは、__iter__メソッドが定義されているものすべてです。たとえば、リストやタプル、イテレータなどです。

イテレータは、一度にすべての値がメモリに格納されるわけではないため、すべての値に同時にアクセスできない iterable のサブセットです。これらは、 、 、mapfilterおよびを使用する関数を使用して生成できます。iteryield

あなたの例でmapは、イテラブルでもあるイテレータを返します。これが、両方の関数がそれで機能する理由です。ただし、たとえばリストを例にとると、次のようになります。

>>> lst = [1, 2, 3]
>>> list(lst)
[1, 2, 3]
>>> next(lst)
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    next(lst)
TypeError: 'list' object is not an iterator

nextiterable である list はiteratorではないため、不平を言っていることがわかります。

于 2013-09-15T06:23:29.233 に答える