Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python TypeError:「NoneType」オブジェクトは反復可能ではありません解決策

Pythonでは、オブジェクトに値がある場合にのみ、オブジェクトを反復処理できます。これは、反復可能なオブジェクトには、値がNoneに等しくない場合にアクセスできる次のアイテムのみがあるためです。 Noneオブジェクトを反復処理しようとすると、TypeError: ‘NoneType’ object is not iterableが発生します。 エラー。

このガイドでは、このエラーの意味と、このエラーが発生する理由について説明します。この一般的なPythonエラーを解決する方法を解決するのに役立つ例を紹介します。

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

オブジェクトを反復可能にするには、オブジェクトに値が含まれている必要があります。 None値はオブジェクトを含まないため、反復できません。 Noneはnull値を表します。

Noneオブジェクトと空のiterableには違いがあります。空のリストまたは文字列がある場合、このエラーは発生しません。

これは、リストと文字列のデータ型が反復可能であるためです。 Pythonインタープリターが空のリストを検出すると、値がないため、リストを反復処理しません。 PythonはNone値を反復処理できないため、インタープリターはエラーを返します。

このエラーは、関数を宣言して値を返すのを忘れた場合によく発生します。

シナリオ例

学生の名前のリストを取得し、「E」で始まる名前を除外するプログラムを作成しましょう。これらの値をコンソールに出力します。

生徒の名前を除外する関数を定義することから始めます。

参加者の81%は、ブートキャンプに参加した後、自分たちの技術的な仕事の見通しについてより自信を持っていると述べました。今日のブートキャンプにマッチしましょう。

平均的なブートキャンプの卒業生は、ブートキャンプの開始から最初の仕事を見つけるまで、キャリアの移行に6か月も費やしませんでした。

def filter_students(class_names):
	new_class_names = []
	for c in class_names:
		if c.startswith("E"):
			new_class_names.append(c)

この関数は、forループを使用して、「class_names」リスト内のすべての項目をループします。アイテムごとに、ループはアイテムが文字「E」で始まるかどうかをチェックします。含まれている場合、その名前は「new_class_names」リストに追加されます。

次に、新しいリストを調べて各値をコンソールに出力する関数を記述します。

def show_students(class_names):
	for c in class_names:
		print(c)

ここでは、プログラムが検索する必要のある学生のリストを宣言します。この学生のリストをfilter_students関数に渡します。

students = ["Elena", "Peter", "Chad", "Sam"]
students_e_name = filter_students(students)

このコードは、名前が「E」で始まるすべての学生を検索するfilter_students関数を実行します。名前が「E」で始まる学生のリストは、students_e_nameと呼ばれます。次に、show_students関数を呼び出して、新しい学生のリストを表示します。

show_students(students_e_name)

コードを実行して、何が起こるか見てみましょう:

Traceback (most recent call last):
  File "main.py", line 14, in <module>
	show_students(students_e_name)
  File "main.py", line 8, in show_students
	for c in class_names:
TypeError: 'NoneType' object is not iterable

コードはエラーメッセージを返します。

ソリューション

show_students関数で変数class_namesを反復処理しようとすると、コードはNone値を検出し、エラーを発生させます。これは、「class_names」として渡した値がNoneであるためです。

このエラーは、filter_students関数が値を返さないために発生します。 filter_students関数の結果を変数students_e_nameに割り当てると、値Noneが設定されます。

このエラーを解決するには、filter_students関数で値を返す必要があります。

def filter_students(class_names):
	new_class_names = []
	for c in class_names:
		if c.startswith("E"):
			new_class_names.append(c)
      # We have added a return statement here
	return new_class_names
        
def show_students(class_names):
	for c in class_names:
		print(c)
    
students = ["Elena", "Peter", "Chad", "Sam"]
students_e_name = filter_students(students)

show_students(students_e_name)

このコードは、new_class_namesの値をメインプログラムに返します。

コードを実行して、機能するかどうかを確認しましょう:

Elena

これで、コードで「E」で始まる名前の生徒の名前が正常に出力されるようになりました。

NoneType例外の回避

技術的には、値を反復処理する前に値がNoneに等しいかどうかを確認することで、NoneType例外を回避できます。次のコードを検討してください。

def filter_students(class_names):
	new_class_names = []
	for c in class_names:
		if c.startswith("E"):
			new_class_names.append(c)
	return new_class_names

def show_students(class_names):
	if class_names is not None:
		for c in class_names:
			print(c)
            
students = ["Elena", "Peter", "Chad", "Sam"]
students_e_name = filter_students(students)

show_students(students_e_name)

「show_students()」関数は、繰り返し試行する前にclass_namesがNone値であるかどうかを確認するため、正常に実行されます。 NoneTypeエラーの原因はコードの他の場所で問題になる可能性があるため、これはほとんどの場合のベストプラクティスではありません。

プログラム全体に「isnotNone」チェックを追加した場合、別の関数でreturnステートメントを見逃したことはわかりません。そのため、このエラーが表示された場合は、「Is not None」チェックを使用して処理するのではなく、例外を受け入れるのが最善です。



結論

TypeError: ‘NoneType’ object is not iterable 値がNoneに等しいオブジェクトを反復処理しようとすると、エラーが発生します。

このエラーを解決するには、反復しようとする値に、文字列やリストなどの反復可能なオブジェクトが割り当てられていることを確認してください。この例では、関数に「return」ステートメントを追加するのを忘れていました。これにより、関数はリストではなくNoneを返します。

これで、この一般的なPythonエラーを独自のコードで解決する準備が整いました。


  1. TypeError:「undefined」はJavaScriptのオブジェクトではありません

    「TypeError:「未定義」はオブジェクトではありません」エラーは、プロパティがアクセスされたとき、またはメソッドが未定義のオブジェクトで呼び出されたときに発生します。このエラーは、Safariブラウザでのみ表示されます。 以下はTypeErrorのコードです-「undefined」はJavaScriptのオブジェクトエラーではありません- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name=

  2. すべての値の出現をチェックするプログラムは、Pythonで一意であるかどうかを確認します

    数値nums(正または負)のリストがあるとすると、配列内のすべての値の出現回数が一意であるかどうかを確認する必要があります。 したがって、入力がnums =[6、4、2、9、4、2、2、9、9、9]のようである場合、6が1回、4が2回あるため、出力はTrueになります。 2回の出現が3回、9回の出現が4回です。したがって、出現回数はすべて一意です。 これを解決するには、次の手順に従います- num_counts:=すべての値とその値の出現回数が保存される新しいマップ オカレンス:=num_countsのすべての値のリスト オカレンスのサイズがオカレンス内の一意の要素の数と