Python入門 interについて

マニュアル

https://docs.python.org/ja/3/library/functions.html?highlight=iter#iter

マニュアルを読むと、第二引数があるかどうかで第一引数の解釈がかなり変わってくると記載されている。

第二引数がない場合

第一引数に int を指定するとTypeErrorエラーになる。

>>> iter('apple')
<str_iterator object at 0x10b9b1070>
>>> iter(['apple'])
<list_iterator object at 0x10b994bb0>
>>> iter({'apple'})
<set_iterator object at 0x10b505ec0>
>>> iter(100)
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    iter(100)
TypeError: 'int' object is not iterable

これはマニュアルのこの部分に書いてあるぽい。

第二引数がない場合、 object は反復プロトコル (__iter__() メソッド) か、シーケンスプロトコル (引数が 0 から開始する __getitem__() メソッド) をサポートする集合オブジェクトでなければなりません。

https://docs.python.org/ja/3/library/functions.html?highlight=iter#iter

interはイテレータオブジェクトを返すので、next()の引数にとることができる。

#! /usr/bin/env python3

hoge = iter('apple')

while True:
    try:
        print(next(hoge))
    except:
        break

第二引数がある場合

第二引数がある場合は、第一引数は呼び出し可能オブジェクトでなくてはいけない。

第二引数 sentinel が与えられているなら、 object は呼び出し可能オブジェクトでなければなりません。この場合に生成されるイテレータは、 __next__() を呼ぶ毎に object を引数無しで呼び出します。返された値が sentinel と等しければ、 StopIteration が送出され、そうでなければ、戻り値がそのまま返されます。

呼び出し可能オブジェクトかどうかはcallable()で確認可能。

#! /usr/bin/env python3
import random

def my_func():
    return random.randrange(1, 5)

print(callable(my_func))

1 – 4 までのランダムな数を返す関数が4を返すまで実行する例

#! /usr/bin/env python3
import random

def my_func():
    return random.randrange(1, 5)

foo = iter(my_func, 4)
while True:
    try:
        print(next(foo))
    except:
        break