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

Python TypeError:「関数」オブジェクトはサブルーチン化できません解決策

反復可能なオブジェクトとは異なり、インデックス構文を使用して関数から値にアクセスすることはできません。

関数がiterableを返す場合でも、その値にアクセスする前に、関数からの応答を変数に割り当てる必要があります。そうしないと、「TypeError:「function」オブジェクトはsubscriptableではありません」というエラーが発生します。

このガイドでは、このエラーの意味について説明します。このエラーの2つの例を見ていき、コードでエラーを解決する方法を理解できるようにします。

TypeError:「関数」オブジェクトはサブルーチン化できません

リストや文字列などの反復可能なオブジェクトには、インデックス表記を使用してアクセスできます。これにより、反復可能から個々のアイテムまたはアイテムの範囲にアクセスできます。

次のコードを検討してください:

grades = ["A", "A", "B"]
print(grades[0])

インデックス位置0の値はAです。したがって、コードは「A」を返します。この構文は関数では機能しません。これは、関数が反復可能なオブジェクトではないためです。関数は、呼び出された場合にのみ反復可能なオブジェクトを返すことができます。

「TypeError:「関数」オブジェクトはサブスクリプト可能ではありません」エラーは、反復可能なオブジェクトであるかのように関数にアクセスしようとすると発生します。

このエラーは、次の2つのシナリオでよく見られます。

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

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

  • 関数にイテラブルと同じ名前を割り当てる場合
  • 関数が反復可能であるかのように関数から値にアクセスしようとした場合

これらの両方のシナリオを分析してみましょう。

シナリオ#1:反復可能と同じ名前の関数

学校の生徒に関する情報を印刷するプログラムを作成します。まず、学生とその最新のテストスコアに関する情報を含む辞書を定義します。

student = { "name": "Holly", "latest_test_score": "B", "class": "Sixth Grade" }

私たちの辞書には、3つのキーと3つの値が含まれています。 1つのキーは学生の名前を表します。 1つのキーは、学生が最新のテストで獲得したスコアを表します。 1つのキーは、生徒が所属するクラスを表します。

次に、これらの値をコンソールに出力する関数を定義します。

def student(pupil):
	print("Name: " + pupil["name"])
	print("Latest Test Score: " + pupil["latest_test_score"])
	print("Class: " + pupil["class"])

このコードは、「瞳孔」辞書の3つの値をコンソールに出力します。 「pupil」ディクショナリは、引数としてstudent()関数に渡されます。

関数を呼び出して、「student」ディクショナリをパラメータとして渡します。

student(student)

Pythonコードはエラーをスローします:

Traceback (most recent call last):
  File "main.py", line 8, in <module>
	student(student)
  File "main.py", line 4, in student
	print("Name: " + pupil["name"])
TypeError: 'function' object is not subscriptable

このエラーは、同じ名前の関数とiterableがあるために発生します。 「学生」は最初に辞書として宣言されます。次に、同じ名前の関数を定義します。これにより、「学生」は辞書ではなく機能になります。

「student」をパラメーターとしてstudent()関数に渡す場合、「student」という名前の関数を渡します。

学生関数の名前を変更することで、この問題を解決します:

def show_student_details(pupil):
	print("Name: " + pupil["name"])
	print("Latest Test Score: " + pupil["latest_test_score"])
	print("Class: " + pupil["class"])

show_student_details(student)

関数の名前を「show_student_details」に変更しました。コードを実行して、何が起こるか見てみましょう:

Name: Holly
Latest Test Score: B
Class: Sixth Grade

私たちのコードは、生徒に関する情報をコンソールに正常に出力します。

シナリオ#2:インデックスを使用した関数へのアクセス

学生の記録のリストをフィルタリングし、学生が最新のテストでAグレードを獲得したものだけを表示するプログラムを作成します。

まず、生徒の配列を定義します。

students = [
	{ "name": "Holly", "grade": "B" },
	{ "name": "Samantha", "grade": "A" },
	{ "name": "Ian", "grade": "A" }
]

私たちの学生リストには3つの辞書が含まれています。各辞書には、学生の名前と最新のテストで獲得した成績が含まれています。

次に、Aグレードを取得した学生のリストを返す関数を定義します。

def get_a_grade_students(pupils):
	a_grade_students = []
	for p in pupils:
    		if p["grade"] == "A":
        			a_grade_students.append(p)

	print(a_grade_students)

	return a_grade_students

この関数は、「生徒」と呼ばれる生徒のリストを受け入れます。この関数は、forループを使用してそのリストを繰り返し処理します。特定の学生が「A」グレードを取得した場合、そのレコードは「a_grade_students」リストに追加されます。そうでなければ、何も起こりません。

すべての学生が検索されると、コードは「A」グレードを獲得した学生のリストを印刷し、そのリストをメインプログラムに返します。

「A」の成績をとった最初の生徒を取得したいと思います。これを行うには、関数を呼び出し、インデックス構文を使用して最初の学生のレコードを取得します。

first = get_a_grade_students[0]

print(first)

コードを実行します:

Traceback (most recent call last):
  File "main.py", line 16, in <module>
	first = get_a_grade_students[0]
TypeError: 'function' object is not subscriptable

コードはエラーを返します。最初に関数を呼び出さずに、「get_a_grade_students」関数から値にアクセスしようとしています。

この問題を解決するには、関数から値を取得する前に関数を呼び出す必要があります。

a_grades = get_a_grade_students(students)
first = a_grades[0]

print(first)

まず、get_a_grade_students()を呼び出します。 関数を作成し、学生のリストをパラメーターとして指定します。次に、インデックスを使用して、get_a_grade_students()のリストからインデックス位置0のレコードを取得します。 関数が戻ります。最後に、そのレコードをコンソールに出力します。

コードを実行してみましょう:

[{'name': 'Samantha', 'grade': 'A'}, {'name': 'Ian', 'grade': 'A'}]
{'name': 'Samantha', 'grade': 'A'}

私たちのコードは、最初に「A」の成績を取得したすべての学生のリストを出力します。次に、コードは「A」の成績を取得したリストの最初の学生を出力します。この場合、その学生はサマンサでした。

結論

「TypeError:'function' object is not subscriptable」エラーは、関数が文字列やリストなどの反復可能なオブジェクトであるかのように、関数からアイテムにアクセスしようとすると発生します。

このエラーを解決するには、最初に、変数を宣言した後に関数を宣言して、値を格納する変数をオーバーライドしないようにしてください。次に、返される値にアクセスする前に、必ず最初に関数を呼び出してください。

これで、プロのコーダーのようにこの一般的なPythonエラーを解決する準備が整いました!


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

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

  2. Pythonのissubset()関数

    この記事では、Python標準ライブラリで利用可能なissubset()関数の実装と使用法について学習します。 issubset()メソッドは、セットのすべての要素が別のセットに存在する場合(引数として渡される場合)はブール値のTrueを返し、それ以外の場合はブール値のFalseを返します。 下の図では、BはAのサブセットです。AとBが同一のセットである場合、AはBの適切なサブセットであることを意味します。これは、両方のセットに同じ要素が含まれていることを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値 boolean True/