プロが教えるわが家の防犯対策術!

プログラミングのpythonについてです。

def decor(func):
def wrap():
print("============")
func()
print("============")
return wrap

def print_text():
print("Hello world!")

decorated = decor(print_text)
decorated()

これを出力すると、

============
Hello world!
============

となるみたいなのですが、なぜなのか教えてほしいです。

A 回答 (2件)

ソースを見ればある程度見当付くと思うのですが


①pythonでは「関数」を引数として受け取り実行できる。
②pythonでは「関数」を作成して戻り値として返すことができる。
③pythonでは「関数」が作られた時、その関数から「見えていた」変数を
その関数が後で実行される時、関数から参照できる。

特にわかりにくいのが③でクロージャと呼ばれる言語機能です。
Javascript等にもある割とメジャーな機能ではあるのですが、
本でゆっくりと踏み締めるように学んだ方が良いと思います。
    • good
    • 0

Pythonでは、関数も「オブジェクト」です。


そのため
・変数に束縛する
・他の関数の引数に渡す
・戻り値として「関数」を返す
ことができます。

関数名 だけだと、関数のオブジェクトです。
後に() を付けて(必要なら引数も指定)すると、「関数を実行した戻り値」になります。


decor は、関数を引数にし、その受けとった関数を使った新しい関数オブジェクトを返します。
decorated = decor(print_text) では、decorで作った「print_text関数を使った関数」を 変数decorated に束縛しています。
decorated() でそれを実行しています。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!