Python TypeError:タイプ「NoneType」のオブジェクトにはlen()ソリューションがありません
len()
メソッドは、文字列、リスト、辞書などの反復可能なオブジェクトでのみ機能します。これは、反復可能なオブジェクトに一連の値が含まれているためです。 len()
を使用しようとした場合 None値のメソッドでは、「TypeError:タイプ「NoneType」のオブジェクトにlen()
がありませんというエラーが発生します。 」。
このガイドでは、このエラーの意味とそのしくみについて説明します。このエラーの実際の2つの例を見ていき、コードでエラーを解決する方法を理解できるようにします。
TypeError:タイプ「NoneType」のオブジェクトにはlen()がありません
NoneTypeは、Noneデータ型を指します。 len()
などの反復可能なオブジェクトで機能するメソッドは使用できません。 、None値。これは、Noneに値のコレクションが含まれていないためです。 Noneには子の値がないため、Noneの長さは計算できません。
このエラーは、次の2つの場合によく見られます。
- 組み込み関数がリストをインプレースで変更することを忘れた場合
- 関数のreturnステートメントを忘れた場合
これらの各原因を詳しく見ていきましょう。
原因#1:組み込み関数がリストをインプレースで変更する
学校の生徒に関する情報を含む辞書のリストを並べ替えるプログラムを作成します。このリストは、最後のテストでの生徒の成績の昇順で並べ替えられます。
まず、生徒とその最新のテストスコアに関する情報を含む辞書のリストを定義します。
students = [ {"name": "Peter", "score": 76 }, {"name": "Richard", "score": 63 }, {"name": "Erin", "score": 64 }, {"name": "Miley", "score": 89 } ]
各辞書には、2つのキーと値が含まれています。 1つは生徒の名前に対応し、もう1つは生徒が最後のテストで獲得したスコアに対応します。次に、sort()
を使用します 生徒のリストを並べ替える方法:
参加者の81%は、ブートキャンプに参加した後、自分たちの技術的な仕事の見通しについてより自信を持っていると述べました。今日のブートキャンプにマッチしましょう。
平均的なブートキャンプの卒業生は、ブートキャンプの開始から最初の仕事を見つけるまで、キャリアの移行に6か月も費やしませんでした。
def score_sort(s): return s["score"] sorted_students = students.sort(key=score_sort)
各辞書の「score」の値を返す「score_sort」という関数を宣言しました。次に、これを使用して、sort()
を使用して辞書のリスト内のアイテムを並べ替えます。 方法。
次に、リストの長さを印刷します:
print("There are {} students in the list.".format(len(sorted_students)))
forループを使用して、辞書の新しいリストをコンソールに出力します。
for s in sorted_students: print("{} earned a score of {} on their last test.".format(s["name"], s["score"]))
このコードは、「sorted_students」リストの各学生の最後のテストで学生が獲得したマークの数を通知するメッセージを出力します。コードを実行してみましょう:
Traceback (most recent call last): File "main.py", line 13, in <module> print("There are {} students in the list.".format(len(sorted_students))) TypeError: object of type 'NoneType' has no len()
コードはエラーを返します。
この問題を解決するには、sort()
の結果を割り当てるコードを削除する必要があります。 「sorted_students」へのメソッド。これは、sort()
が原因です。 メソッドはその場でリストを変更します。新しいリストは作成されません。
「sorted_students」リストの宣言を削除し、プログラムの残りの部分で「students」を使用します。
students.sort(key=score_sort) print("There are {} students in the list.".format(len(students))) for s in students: print("{} earned a score of {} on their last test.".format(s["name"], s["score"]))
コードを実行して、何が起こるかを確認します:
There are 4 students in the list. Richard earned a score of 63 on their last test. Erin earned a score of 64 on their last test. Peter earned a score of 76 on their last test. Miley earned a score of 89 on their last test.
コードは正常に実行されます。まず、コードはリストに含まれる学生の数を示します。次に、コードは、各学生に関する情報と、最後のテストで獲得したマークの数を出力します。この情報は、生徒の成績の昇順で印刷されます。
原因#2:Returnステートメントを忘れる
コードをよりモジュール化する予定です。これを行うには、ソート方法を独自の関数に移動します。また、各生徒がテストで獲得したスコアに関する情報を出力する関数も定義します。
生徒のリストと並べ替えヘルパー関数を定義することから始めます。このコードは、チュートリアルの前半から借用します。
students = [ {"name": "Peter", "score": 76 }, {"name": "Richard", "score": 63 }, {"name": "Erin", "score": 64 }, {"name": "Miley", "score": 89 } ] def score_sort(s): return s["score"]
次に、リストを並べ替える関数を記述します。
def sort_list(students): students.sort(key=score_sort)
最後に、各生徒の成績に関する情報を表示する関数を定義します。
def show_students(new_students): print("There are {} students in the list.".format(len(students))) for s in new_students: print("{} earned a score of {} on their last test.".format(s["name"], s["score"]))
コードを実行する前に、関数を呼び出す必要があります:
new_students = sort_list(students) show_students(new_students)
プログラムはまず、sort_list()
を使用してリストを並べ替えます。 関数。次に、私たちのプログラムは、各学生に関する情報をコンソールに出力します。これはshow_students()
で処理されます 機能。
コードを実行してみましょう:
Traceback (most recent call last): File "main.py", line 21, in <module> show_students(new_students) File "main.py", line 15, in show_students print("There are {} students in the list.".format(len(new_students))) TypeError: object of type 'NoneType' has no len()
コードはエラーを返します。このエラーは、「sort_list」関数に「return」ステートメントを含めるのを忘れたために発生しました。
sort_list()
を呼び出すとき 関数では、その応答を変数「new_students」に割り当てます。その変数はshow_students()
に渡されます 各学生に関する情報を表示する機能。このエラーを解決するには、returnステートメントをsort_list()
に追加する必要があります。 関数:
def sort_list(students): students.sort(key=score_sort) return students
コードを実行します:
There are 4 students in the list. Richard earned a score of 63 on their last test. Erin earned a score of 64 on their last test. Peter earned a score of 76 on their last test. Miley earned a score of 89 on their last test.
私たちのコードは私たちが期待した応答を返します。
結論
「TypeError:タイプ「NoneType」のオブジェクトにはlen()
がありません 」エラーは、len()
を使用しようとすると発生します 値がNoneであるオブジェクトのメソッド。
このエラーを解決するには、sort()
などの組み込みのリストメソッドの応答を割り当てていないことを確認してください。 、変数に。これでエラーが解決しない場合は、プログラムが正常に機能するために必要なすべての「return」ステートメントがあることを確認してください。
これで、Pythonプロフェッショナルのようにこの問題を解決する準備が整いました!
-
Pythonプログラムのtypeとisinstance
このチュートリアルでは、Pythonのタイプとインスタンスの組み込み関数について学習します。これらの関数は、一般にオブジェクトのタイプを判別するために使用されます。それらを1つずつ見てみましょう。 type(object) タイプ オブジェクトのタイプを知るために使用されます。たとえば、オブジェクト valがある場合 値5 。そのオブジェクトのタイプはint 。 タイプを使用してそれを取得できます 働き。結果を得るには、一般的な手順に従いましょう。 オブジェクトを初期化します。 type(object)を使用してオブジェクトのタイプを取得します 機能。 タイプを表示します。 以下
-
Pythonオブジェクトの内部を確認するにはどうすればよいですか?
Pythonには、Pythonオブジェクトの属性、プロパティ、メソッドに関する情報を収集するための次の組み込み関数の強力なセットがあります- type() dir() id() getattr() hasattr() globals() locals() callable() type()とdir()は、それぞれオブジェクトのタイプとその属性のセットを見つけるのに特に役立ちます。