Python における第一級市民としての関数の意味

Pythonにおける第一級市民としての関数の意味

関数は Python の第一級市民であり、関数はオブジェクトです。Python の関数は第一級市民の地位を持っているため、高階関数、クロージャ、デコレータなどの機能を Python で簡単に作成でき、関数プログラミングでも広く使用されています。

プログラミング言語では、次の 3 つの条件のいずれかを満たしているオブジェクトを「第一級市民」と呼ぶことができます。

変数に格納できます。

関数に引数として渡すことができます。

関数の戻り値として使用できます。

Python の関数はこれらの条件を満たしているため、第一級市民と呼ばれます。

関数は変数に格納できる

たとえば、次のコードは 2 つの数値を加算する関数 add(x, y) を定義し、その関数を変数 func に割り当てます。

def add(x, y):
    return x + y

func = add #func 变量保存了函数 add 的引用
result = func(1, 2) #可以像调用普通函数一样来调用它func
print(result) # 输出:3

関数にパラメータとして渡される関数

ソースコードの例は次のとおりです。

def add(x, y):
    return x + y

def subtract(x, y):
    return x - y

def apply(func, x, y):
    return func(x, y)

result1 = apply(add, 3, 4)    # 调用 add 函数并将其作为参数传递给 apply 函数
result2 = apply(subtract, 3, 4)   # 调用 subtract 函数并将其作为参数传递给 apply 函数

print(result1)    # 输出:7
print(result2)    # 输出:-1

上の例では、add()、subtract()、apply() の 3 つの関数を定義しました。このうち、apply() 関数は、関数 func と 2 つの値 x と y の 3 つのパラメーターを受け入れます。func(x, y) を呼び出し、結果を返します。次に、apply() 関数を 2 回呼び出しました。1 回目は add() 関数がパラメータとして渡され、2 回目はsubtract() 関数がパラメータとして渡されました。このように、関数パラメータを通じて特定の計算操作を指定でき、さまざまな結果を得ることができます。

関数をパラメータとして関数に渡すことは、Python プログラミング言語の一般的なプログラミング手法の 1 つであり、関数をより多用途かつ柔軟にします。

関数は関数の戻り値として使用できます

ソースコードの例は次のとおりです。

def calculator(operation):
    def add(x, y):
        return x + y

    def subtract(x, y):
        return x - y

    if operation == 'add':
        return add
    elif operation == 'subtract':
        return subtract
    else:
        return None

# 返回 add 函数并将其赋值给 calc_add 变量
calc_add = calculator('add')

# 调用 calc_add 函数计算结果
result = calc_add(3, 4)

print(result)    # 输出:7

上の例では、文字列パラメータ操作を受け入れ、パラメータに応じて異なる関数を返す calculator() 関数を定義しました。操作パラメータが「add」の場合は加算関数 add() を返し、操作パラメータが「subtract」の場合は減算関数subtract()を返し、それ以外の場合はNoneを返します。

次に、calculator() 関数を呼び出し、その戻り値を変数 calc_add に代入します。「add」パラメータを渡したので、calc_add 変数は加算関数 add() への参照を保持します。最後に、calc_add() 関数を使用して 3 と 4 の合計を計算し、結果 7 を取得します。

戻り値としての関数の使用。異なる関数を返すことで、同じ関数に異なる関数を実装できるため、コードの再利用性と柔軟性が向上します。

関数は引数として関数を受け取り、結果として新しい関数を返すことができます。

ソースコードの例は次のとおりです。

def add_suffix(func):
    def wrapper(text):
        return func(text) + "!"
    return wrapper

def greet(name):
    return "Hello, " + name

greet_with_exclamation = add_suffix(greet)
print(greet_with_exclamation("Alice")) # Hello, Alice!

この例では、2 つの関数を定義します。

add_suffix 関数は、引数として関数 (ここでは func) を受け取り、結果として新しい関数 (内部定義されたラッパー関数) を返します。

welcome 関数は誰かに挨拶し、対応する挨拶文字列を返します。

add_suffix を呼び出し、greet 関数を引数として渡します。新しい関数ラッパーは add_suffix 関数内で定義され、元の関数 (ここでは、greet 関数) に感嘆符の接尾辞を追加します。最後に、add_suffix 関数はこの新しい関数ラッパーを返します。

welcome_with_exclamation を呼び出すと、実際には内部ラッパー関数が呼び出され、変更された挨拶結果が取得されます。

この例では、関数が別の関数を引数として受け取り、新しい関数を返す高階関数の概念を示します。このパターンは多くの状況で非常に役立ち、コードがより柔軟で再利用可能になります。ただし、この方法を使用すると、特に装飾が必要な関数が複数ある場合、コードが長く複雑になる可能性があります。

上記の例を変更して、デコレータを使用すると、コードがより簡潔で読みやすくなります。

def add_suffix(func):
    def wrapper(text):
        return func(text) + "!"
    return wrapper

@add_suffix
def greet(name):
    return "Hello, " + name

print(greet("Alice")) # Hello, Alice!

ここでは、関数を引数として受け取り、新しい関数を返すデコレータ add_suffix を定義します。グリーティング関数の定義の前に @add_suffix を追加することで、グリーティング関数にデコレータを適用します。

デコレータの役割は、元の関数定義を変更せずに追加の機能や動作を追加することです。この場合、add_suffix デコレータは元の挨拶出力の後に感嘆符を追加します。

デコレーターを使用すると、デコレーター関数を明示的に呼び出して新しい関数を生成することを回避できますが、関数の定義時に @decorator_name 糖衣構文を直接使用してデコレーターを適用することができます。言い換えれば、デコレータ構文シュガーはデコレータを使用する手順を簡素化し、デコレータ関数や代入操作を手動で呼び出す必要がなくなりました。

デコレーターを使用すると、デコレーター関数を明示的に呼び出して新しい関数を生成することを回避できますが、関数の定義時に @decorator_name 糖衣構文を直接使用してデコレーターを適用することができます。「Syntactic Sugar」とは、プログラマが特定の一般的なプログラミング パターンや操作をより簡潔で読みやすい方法で表現できるようにする、プログラミング言語の特別な構文を指します。これらの構文糖はプログラミング言語自体の機能や能力には影響しませんが、コードの読みやすさ、保守性、開発効率を大幅に向上させることができます。

Python では、デコレータは典型的な構文糖衣です。デコレータ構文を使用すると、より簡潔かつ直感的な方法で関数を定義し、次のような関数を関数に追加できます。

@my_decorator
def my_function():
    # 関数本体

このうち、@my_decorator は糖衣構文であり、実際には次のコードと同等

def my_function():
    # 関数数体
my_function = my_decorator(my_function)

デコレータの詳細については、https://blog.csdn.net/cnds123/article/details/115588075を参照してください。

おすすめ

転載: blog.csdn.net/cnds123/article/details/131234993