関数が Python で定義されていないエラー

Salman Mehmood 2023年6月21日
  1. Python で宣言前に関数を呼び出さない
  2. Python でスペルミスのある変数名または関数名を使用しないようにする
  3. Python でインポートせずに組み込みモジュールを使用しない
  4. Python の範囲外の変数の問題を修正する
関数が Python で定義されていないエラー

この説明で、関数がスクリプトに存在するにもかかわらず、Python プログラムが NameError: name '<functionName>' is not defined のようなエラーを表示する場合がどうなるかを学びます。

また、スペルミスのある変数や組み込み関数をインポートせずに使用するとどうなるか、Python でこれらのエラーを回避する方法も学びます。

Python で宣言前に関数を呼び出さない

Python で NameError: function is not defined が発生する理由は多数あります。このエラーが発生する最も一般的な理由について説明します。 プログラムで定義する前に関数を呼び出すと、Python インタープリターは関数定義を見つけることができません。

その場合、関数は表示されず、Python インタープリターはまだ関数定義に遭遇していません。 したがって、Python インタープリターは混乱してエラーをスローします。これは、関数がインタープリターに従って定義されていないことを意味します。

この簡単な例を見てみましょう。 このプログラムでは、関数を定義する前に call ステートメントを記述しました。 インタープリターは Python プログラムを 1 行ずつ実行するため、最初の行から実行を開始すると特定の関数呼び出しに遭遇しますが、Hello() が何であるかはわかりません。

Hello()


def Hello():
    print("I will never be called")

この Python スクリプトを実行すると、それが関数であるかどうかについて混乱し、Python インタープリターが停止してエラーをスローします。 これは、この関数の定義が関数呼び出しの後に存在するためです。 そのため、関数を定義する前に呼び出したり呼び出したりすることはできません。

NameError: name 'Hello' is not defined

このエラーを修正するには、呼び出す前に関数を定義する必要があります。

Python でスペルミスのある変数名または関数名を使用しないようにする

このエラーが発生するもう 1つの理由は、ユーザーが関数の正しいスペルの定義を間違えた場合です。 これが、ユーザーがこのタイプのエラーを受け取っている理由です。 Python では大文字と小文字が区別されるため、小文字と大文字は異なる機能になります。

例を調べて、スペルミスのある変数を取得したときにインタープリターがどのように動作するかを示します。

Orange = "orange"

for i in orange:
    print(i)

出力:

NameError: name 'orange' is not defined

Python スクリプトを実行すると、'orange' が定義されていませんというエラーが表示されますが、今回はスペル ミスがなかったのに、この変数を定義したにもかかわらず、なぜこのエラーが表示されるのでしょうか? これは、大文字で始まり、小文字でアクセスしようとしている変数を定義したためです。

同じシナリオが関数に適用されます。 Orange 変数を orange でオーバーライドすると機能します。

orange = "orange"

for i in orange:
    print(i)

出力:

o
r
a
n
g
e

Python でインポートせずに組み込みモジュールを使用しない

たとえば、Python プログラムを作成していて、print()input() などの組み込み関数を使用したい場合は、それをコードで使用できます。 Python に組み込まれていないが、特定のモジュールに存在する関数を使用する必要がある場合はどうなりますか?

特定のモジュールの一部である関数を使用するには、まずそのモジュールを Python プログラムにインポートする必要があります。 一部の初心者は、特定のモジュールをインポートする代わりに、モジュールから関数を使用しようとすると失敗します。 例を見てください。

このプログラムでは、ユーザーはランダムな値を生成しようとしますが、ユーザーがこのコードを実行すると、前述したのと同じエラーが発生します。 その理由は、random であるモジュールをインポートせずに random() 関数にアクセスしようとして、ユーザーが失敗するところにあります。

Randome_Values = random.random()

print(Randome_Values)

出力:

NameError: name 'random' is not defined

ユーザーが Python スクリプトで random モジュールをインポートすると機能します。

import random

Randome_Values = random.random()
print(Randome_Values)

出力:

0.07463088966802744

ユーザーが Python モジュールを自分で作成しても、問題に直面して同じエラーが発生することがあります。

これは、ユーザーがクラスのインポート後に別のファイルから関数を呼び出そうとしているためですが、関数が定義されているファイルをユーザーが保存しなかった可能性があるため、このエラーが発生しています。 したがって、この関数を呼び出す前に必ず保存してください。

Python の範囲外の変数の問題を修正する

ほとんどの初心者が失敗するもう 1つの理由は、スコープ外の変数にアクセスしようとして同じエラーが発生した場合です。 理解を深めるための例を見てみましょう。

def take_order():
    orders = input("Enter your orders and separate it using comma :").split(",")
    return orders


def Delete_Orders():
    deleted_orders = input("Enter your order name which you want to cancel :")
    orders.remove(deleted_orders)
    return orders


print(take_order())

print(Delete_Orders())

この Python スクリプトを実行すると、take_order() 関数は正しく機能しますが、Delete_Orders() 関数を呼び出して orders リストから注文を削除すると、エラーが発生します。

NameError: name 'orders' is not defined

これは、orders 変数が take_order() 関数で定義されており、Delete_Orders() 関数からアクセスしようとしているためです。 これが、実行制御が到達したときに、アイテムを orders リストから削除する理由です。 スコープ外でアクセスしているため、エラーがスローされます。

この問題を修正するには、空の文字列を格納する変数を宣言する必要があり、変数名は orders になります。 その後、再利用可能にするために、orders 変数と呼ばれる global キーワードを使用する必要があります。

orders = ""


def take_order():
    global orders
    orders = input("Enter your orders and separate it using comma :").split(",")
    return orders


def Delete_Orders():
    deleted_orders = input("Enter your order name which you want to cancel :")
    orders.remove(deleted_orders)
    return orders


print(take_order())
print(Delete_Orders())

出力:

Enter your orders and separate it using comma :pizza,drink,water
['pizza', 'drink', 'water']
Enter your order name which you want to cancel :water
['pizza', 'drink']
著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

関連記事 - Python Error