logo

TypeError を修正する方法:「NoneType」オブジェクトは Python で反復可能ではありません

パイソン は人気があり汎用性の高いプログラミング言語ですが、他の言語と同様に、デバッグにイライラするエラーが発生する可能性があります。開発者が遭遇する一般的なエラーの 1 つは、 TypeError: 「NoneType」オブジェクトは反復可能ではありません。 この記事では、このエラーが発生する可能性のあるさまざまなシナリオを検討し、効果的に対処するのに役立つ実用的な解決策を提供します。

エラーの理解: NoneType' オブジェクトは Iterable ではありません

エラーメッセージ TypeError:「NoneType」オブジェクトは反復可能ではありません パイソン 通常、値が次のオブジェクトを反復処理しようとしたときに発生します。 なし 。このエラーは、None が反復可能ではないために発生します。つまり、リスト、タプル、またはその他の反復可能なオブジェクトのようにループ処理することができません。



構文: TypeError: ‘NoneType’ オブジェクトは反復可能ではありません

TypeError の原因: 「NoneType」オブジェクトは反復可能ではありません

  • 戻りステートメントがありません
  • 無効な API 応答
  • 値が None の変数を反復処理する
  • なし クラスの型エラー
  • Lambda 関数と NoneType エラー

戻りステートメントがありません

このエラーを引き起こす最も一般的なシナリオの 1 つは、関数内の return ステートメントが欠落していることです。を返す関数があるとします。 リスト 数値ですが、return ステートメントを含めるのを忘れています。

Python3








def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> ># Missing return statement> result>=> generate_numbers()> for> num>in> result:> >print>(num)>

>

Verilogパラメータ

>

出力

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->結果の num に 6 : 7 print(num) TypeError: 'NoneType' オブジェクトは反復可能ではありません>

この場合、 ' generate_numbers()’ 何も返しません。つまり、None を返します。結果を反復しようとすると、「 タイプエラー' None を反復処理できないためです。

解決策: 適切な返品を保証する

このエラーを修正するには、関数が期待値を返すようにしてください。この例では、 return ステートメントを追加する必要があります。 「generate_numbers()」:

Python3




def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> >return> numbers> result>=> generate_numbers()> for> num>in> result:> >print>(num)>

>

>

出力

1 2 3 4 5>

今、 生成番号() 数値のリストが返され、エラーは解決されます。

無効な API 応答

このエラーが発生する可能性があるもう 1 つのシナリオは、 API 。データをフェッチする API リクエストを作成しているが、API は予期したデータの代わりに None を返したとします。

Python3




import> requests> def> fetch_data():> >response>=> requests.get(>' https://api.openweathermap.org/data '>)> >if> response.status_code>=>=> 200>:> >return> response.json()> >else>:> >return> None> data>=> fetch_data()> for> item>in> data:> >print>(item)>

>

>

出力

Java から文字列へのロング
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->データ内の項目の 11: 12 print(item) TypeError: 'NoneType' オブジェクトは反復可能ではありません>>' 

もし API リクエストが失敗するか、None が返されると、 'タイプエラー' データを反復処理しようとするとき。

解決策: API レスポンスを確認する

この状況に対処するには、反復処理を試みる前に API 応答を確認する必要があります。コードの改良版は次のとおりです。

Python3




import> requests> def> fetch_data():> >response>=> requests.get(>' https://api.openweathermap.org/data '>)> >if> response.status_code>=>=> 200>:> >return> response.json()> >else>:> >return> [ ]> data>=> fetch_data()> for> item>in> data:> >print>(item)>

>

ステータス コードが 200 でない場合は、システムに問題があったことを意味します。 API リクエスト。この場合、None の代わりに空のリスト [] をプレースホルダー値として返します。空のリストを返すことで、 「なしタイプ」 コードの後半で応答データを反復しようとするとエラーが発生します。

値が None の変数を反復処理する

このシナリオは簡単で一般的です。これは、値が None である変数をループ (反復) しようとすると発生します。

Python3




my_list>=> None> for> item>in> my_list:> >print>(item)>

>

>

出力

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->my_list の項目の 2: 3 print(item) TypeError: 'NoneType' オブジェクトは反復可能ではありません>

このシナリオでは、変数「 私のリスト' は「なし」に設定されます。 for ループが反復処理を試行するとき '私のリスト' に遭遇します。 TypeError: 「NoneType」オブジェクトは反復可能ではありません。 このエラーは、None が反復可能なオブジェクトではないため、ループ処理できないために発生します。

解決策: ループする前に Iterable が存在することを確認する

このエラーを修正するには、次のことを確認する必要があります。 '私のリスト' 反復処理を試行する前に、反復可能なオブジェクト (リスト、タプルなど) が含まれています。のようなチェックを追加すると、 my_list が None でない場合 ループの前に、ループ内のコードが次の場合にのみ実行されるようにします。 私のリスト None ではないため、 「なしタイプ」 エラー。

Python3




my_list>=> None> if> my_list>is> not> None>:> >for> item>in> my_list:> >print>(item)>

>

>

なし クラスの型エラー

クラス パイソン 遭遇することもできる 「なしタイプ」 特に None を返すメソッドを使用する場合にエラーが発生します。値を返さないメソッドを持つクラスを考えてみましょう。

という名前のクラスがあるとします。 '学生'。 このクラスでは、生徒の名前と成績を保存したいと考えています。クラスには というメソッドがあります 「get_grades()」 論理的には、学生の成績が返されるはずです。この状況で、「」という名前の学生が アリーシャ」 グレードのリストを使用して作成されます。目的は、アリーシャの成績が 90 以上であるかどうかを確認し、それを出力することです。

最初のコードは次のとおりです。

おっとコンセプト

Python3




class> Student:> >def> __init__(>self>, name,grade):> >self>.name>=> name> >self>.grade>=> grade> > >def> get_grades(>self>):> > >print>(>self>.grade)> > > student>=> Student(>'Alisha'>,[>90>,>85>,>88>,>92>])> for> grade>in> student.get_grades():> >if> grade>>>=>90>:> >print>(grade)>

>

>

出力

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 4 line 13 8 print(self.grade) 11 student = Student('Alisha',[90,85,88,92]) --->Student.get_grades() の成績の場合は 13: 14 成績>=90 の場合: 15 print(grade) TypeError: 'NoneType' オブジェクトは反復可能ではありません>

問題は 「get_grades()」 方法。成績は出力されますが、返されません。ループスルーしようとすると 「student.get_grades()」 、成績は出力されますが、ループ内で使用できる値は表示されません。

したがって、次の結果を反復しようとすると、 「student.get_grades()」、 暗黙的に返されます 'なし' なぜなら、明示的な return ステートメントがないからです。 「get_grades()」 方法。 パイソン は、この None を考慮します。これは反復可能ではありません。その結果、私たちは次のような事態に遭遇します。 TypeError:「NoneType」オブジェクトは反復可能ではありません エラー。

解決策: クラスメソッドから適切な値を返す

この問題を解決するには、 「get_grades()」 方法。成績を単に出力するのではなく、成績を返す必要があります。成績を返すということは、メソッドの呼び出し元に反復可能オブジェクト (この場合は成績のリスト) を提供することを意味します。成績を返すことにより、メソッドは反復可能になり、ループが意図したとおりに動作できるようになります。

Python3




class> Student:> >def> __init__(>self>, name,grade):> >self>.name>=> name> >self>.grade>=> grade> > >def> get_grades(>self>):> > >return> self>.grade> > > student>=> Student(>'Alisha'>,[>90>,>85>,>88>,>92>])> for> grade>in> student.get_grades():> >if> grade>>>=>90>:> >print>(grade)>

>

最も美しい笑顔
>

したがって、この修正されたコードでは、 「get_grades()」 メソッドの戻り値 「自己採点」、 それがグレードのリストです。反復すると 「student.get_grades()」 、グレードのリストを繰り返し処理しますが、グレードはありません。 「なしタイプ」 有効な反復可能オブジェクトを反復しているため、エラーが発生します。

出力

90 92>

Lambda 関数と NoneType エラー

エラー TypeError:「NoneType」オブジェクトは反復可能ではありません で発生する可能性があります ラムダ関数 特定の状況でラムダ関数が None を返したとき。これは通常、特定の入力値に対して条件付きで None を返す場合に発生します。 None を返すラムダ関数の結果を反復しようとすると、このエラーが発生します。

例: この例では、入力が バツ 0以下です (x>0) ラムダ関数 なしを返します。結果を反復しようとすると、None を反復しようとするため、 TypeError:「NoneType」オブジェクトは反復可能ではありません エラー。

Python3




my_lambda>=> lambda> x: x>*> 2> if> x>>>0> else> None> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)>

>

>

出力

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 5 line 3 1 my_lambda = lambda x: x * 2 if x>0 else なし 2 result = my_lambda(-1) ----> 結果の項目の 3: 4 print(item) TypeError: 'NoneType' オブジェクトは反復可能ではありません>

解決策: 反復可能な結果を​​保証する

このエラーを修正するには、ラムダ関数が None を返すケースを処理する必要があります。これを処理する 1 つの方法は、次の場合にデフォルトの反復可能オブジェクト (空のリストなど) を提供することです。 なし。 修正されたコードは次のとおりです。

Python3




my_lambda>=> lambda> x: [x>*> 2>]>if> x>>>0> else> []> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)>

>

>

出力: この修正されたコードでは、 ラムダ関数 を含むリストを返します × * 2 もし 'バツ' が 0 より大きい場合。 'バツ' 0 より大きくない場合 (-1 の場合と同様)、空のリストを返します。これで、次のような問題が発生することなく結果を反復処理できるようになりました。 「なしタイプ」 エラー。