70104


Pythonの特殊メソッド `iter` について、以下のコード例を見かけました。

[【Python入門】クラス利用時の特殊メソッド一覧（サンプルコード付き）](https://blog.codecamp.jp/python-class-
code)

>
[code]

>     class ITER():
>       def __init__(self, max = 0):
>           self.max = max
>  
>       def __iter__(self):
>           self.n = 0
>           return self
>  
>       def __next__(self):
>           if self.n <= self.max:
>               result = 2 ** self.n
>               self.n += 1
>               return result
>           else:
>               raise StopIteration
>  
>     x = ITER(2)
>     i = iter(x)
>     print(next(i))
>     print(next(i))
>     print(next(i))
>  
[/code]

`iter()` には引数として配列やタプルが入る思っていたのですが、クラスのオブジェクトも引数として取る事が可能なのでしょうか？


CC BY-SA 4.0
2020-09-03T06:38:13.817
70102
2020-09-03T11:33:30.937
2020-09-03T11:33:30.937
3060
22565
question
python python3
Pythonの特殊メソッド iter ではクラスのオブジェクトも引数として取る事が可能？


Pythonには、iterable という概念があり、`iter()`の(第一)引数には 任意のiterableなクラスのオブジェクトを渡すことができます。

あなたが挙げた配列やタプルは組み込みのiterableなオブジェクトの代表例ですが、iterableでさえあれば、自作のクラスを渡すこともできます。

[iterable](https://docs.python.org/3/glossary.html#term-iterable)

> An object capable of returning its members one at a time. Examples of
> iterables include all sequence types (such as list, str, and tuple) and some
> non-sequence types like dict, file objects, and objects of any classes you
> define with an `__iter__()` method or with a `__getitem__()` method that
> implements Sequence semantics.

原文は少し説明が分かりにくいですが、

  * `__iter__()`メソッドが定義されている. (かつそれが、iterator を返す.)

または、

  * `__getitem__()`メソッドが定義されており、Sequence のセマンティックスを実装している.

ような任意のクラスのオブジェクトはiterableであるとされています。

あなたが見つけられた`ITER`クラスは、この1つ目のルール「`__iter__()`メソッドが定義されている. (かつそれが、itertor
を返す.)」にマッチしているのでiterableであり、そのため`iter()`に渡すことができるわけです。

* * *

ちなみにiterableなオブジェクトは、for-inにもそのまま使えたり、アンパックもできたりします。

[code]

    # `ITER`の定義は同じとする
    x = ITER(2)
    for i in x:
      print(i)
    
    a, b, c = x
    print(a, b, c)
    
[/code]


CC BY-SA 4.0
2020-09-03T08:44:37.787
70104
2020-09-03T08:44:37.787
13972
70102
answer