【Python】for文での ‘int’ object is not iterable の原因と対策

今回はPythonのfor文で見かけるエラーについてです。

‘int’ object is not iterable

なぜ起きて、どう対処すればよいのでしょうか。

どんなときに起きるのか

このエラーはfor文で繰り返す対象がイテラブル(反復可能)でない場合に投げられるエラーです。

たとえば5回繰り返したい処理があるとします。以下のように記述するとエラーになります。

for i in 5:
    print(i)

>> TypeError: 'int' object is not iterable

ここで出てくるのが”TypeError: ‘int’ object is not iterable”ですint型はイテラブルでないので反復不可だと怒られます。

実際の場面でよくあるのが、配列の要素数の数だけ繰り返したい場合、以下のようにすると同様のエラーとなってしまいます。

li_sample = [1,2,3,4,5]

for i in len(li_sample):
    print(i)

>> TypeError: 'int' object is not iterable

イテラブルとはどういうことなのか

Pythonにおけるiterable(イテラブル)とは反復可能なオブジェクトを指し、イテラブルなオブジェクトであればfor文のin句に用いることができます。以下のオブジェクトはイテラブルです。

  • 配列
  • タプル
  • 辞書
  • 文字列
  • 集合
  • rangeオブジェクト
#配列
for i in [1,2,3,4,5]:
    print(i)

#タプル
for i in (1,2,3,4,5):
    print(i)

#辞書
for i in {1:"1",2:"2",3:"3",4:"4",5:"5"}:
    print(i)

#文字列
for i in "abcde":
    print(i)

# 集合
for i in {0,1,2,3,4,5}:
    print(i)

#rangeオブジェクト
for i in range(5):
    print(i)

繰り返したい対象について、要素を1つずつ取り出せるものがイテラブルです。配列やタプルの場合は要素1つずつ、文字列の場合は1文字ずつ取り出して繰り返し処理を行うことができます。

対策

先述したとおり、len(配列)をfor文のin句に入れるとエラーになります。配列の要素数回繰り返す場合は以下のようにする必要があります。

li_sample = [1,2,3,4,5]

for i in range(len(li_sample)):
    print(i)

ここで、len(li_sample)とrange(len(li_sample))の中身を確認しておくと、

len(li_sample)
>> 5

range(len(li_sample))
>> range(0, 5)

range(0, 5)は実際は0から4までの連続した数値を要素に持つオブジェクトです(終了に指定した数値は含まれません)。

なので、len()は繰り返し不可でfor文で使えず、range()は繰り返し可能でfor文でも使えます。

まとめ

for文での ‘int’ object is not iterableエラーについて見てきました。for文in句に使えるのは繰り返し可能なオブジェクトのみです。このエラーが出た際は、繰り返そうとしている対象が繰り返し可能なオブジェクトに該当しているかを確認してください。

ではでは👋