「関数そのもの」という考えかたは理解するのがちょっと難しいかもしれません。いろいろな例にあたって慣れるしかないと思います。
少しは理解の助けになればということで、ちょっと説明してみます。
まずは普通のデータについて。
python
1a = 'hello'
2A = a.upper()
aに文字列'hello'が入ると説明されますが、一歩踏みこむと、'hello'と記述すると文字列を表わすオブジェクトが作られて、= によって、 変数aに割り当てられれいる、ということになります。
aに入るのは、そのままの文字の並びではなく文字列型のオブジェクトで、いろいろな関数(メソッド)を持っています。 たとえば、その中のupperメソッドを使うと、AにHELLOという文字を表わる文字列オブジェクトガ入ります。
python
1d = {'身長':170, '体重':70}
2w = d.get('体重')
同様に、dに入るのは、身長と体重をキーに持つ辞書(dict)ですが、これも見たとおりではなく、辞書型を持つオブジェクトがdに入ります。 文字列のときと同様に、メソッドがあり、たとえば、valuesメソッドを呼ぶと、wには体重の値が入ります。
辞書型にはキーから値を取りだすための、特殊な構文があって、それは、[]を使うものです。
とすることで、getメソッドどほぼ同じようなことができます。
このように、pythonで扱う各種データはオブジェクトであり、値やメソッドを持っています。そして、変数に代入したり、関数やメソッドの引数にしたり、返り値として返したりすることができます。
さて、関数についてはどうでしょうか。Cなどでは、関数は特別なもので変数に代入したり関数の引数にしたりなどはできません。
しかし、pythonなどの最近の言語(lispは昔からですが)では、関数そのものも関数オブジェクトとして定義されていて、他のオブジェクトと同様に変数に代入したり、引数にしたり、返したりすることができるようになっています。
python
1def x():
2 print('this is x')
この構文は関数特有の構文ですが、やっていることは代入と同じで、定義の通りに作られた関数オブジェクトが作られて、変数xに代入されます。
オブジェクトのなで、あまり使われませんが、メソッドも持っています。
python
1def x():
2 """
3 関数xです。
4 """
5 print('this is x')
6
7d = x.__doc__
8print(d)
関数定義ときに説明文字列(docストリング)を付けておいて__doc__メソッドを呼ぶと、内容が取り出せます。
そして、その作った関数を関数として呼び出す方法が後ろに()をつけて中に引数を入れる構文です。
辞書のときにキーから値を取り出すときに[]を使ったのと同様です。
このように、pythonでは関数も、特殊な機能は持っていますが、他のオブジェクトと同様のオブジェクトであるということです。
どんな時に使うのかというのは、まあ、質問の元になっているデコレータなどは、この扱いでなければ実現できないものですが、簡単な例だとこんなものがあります。
python
1l = [1, -3, 2]
2
3print(sorted(l))
4# [-3, 1, 2]
リストのソートです。何も指定しなければ小さい順に並べ変えてくれます。
このsorted関数に他の観点で並び変えたい場合、key引数というのがあって、これが「関数」を受け取ります。
python
1print(sorted(l, key=abs))
2# [1, 2, -3]
ここでkeyに渡されているのがabs関数です。 これは引数の絶対値を返す関数で、結果として絶対値の小さい順に並べ変えられます。
ここで、関数を渡すことができなければ、sorted関数にその機能を盛り込むか、自分でそのような並べ替え関数を作らなければなりません。
こんな感じです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/11 08:27