前提・実現したいこと
Pythonを学習していて関数オブジェクトを教わりました。そこで疑問におもったのがdef (関数名)()
の関数名の部分が関数オブジェクトなんですか?
発生している問題・エラーメッセージ
エラーメッセージはありません。 `` ### 該当のソースコード ```Python ソースコードはありません
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
本質的に問われるべきは
名前っていったいなんですか?
だと思いました。
あなたは"名前"という概念をどう捉えていますか?
辞書にはこう載ってます。
https://www.weblio.jp/content/%E5%90%8D%E5%89%8D
ある人や事物を他の人や事物と区別して表すために付けた呼び方。
関数の本質は"手続きのかたまり"です。
「あれをやって、これをやって、もしあれがこうなっていた時はこれをして、それがあああなるまでこれを繰り返して、これがこういう状態になったら終了」というような抽象的な手続きを、プログラマはコードとして具体化します。
その中から"意味のある連なり"を取り出して"ひとまとめのかたまり"にしたものが、
「これらの引数をとって、これをやって、もしあれがこうなっていた時はこれをして、それがあああなるまでこれを繰り返して、最後にこの値を返す」というような、抽象的な"手続きのかたまり"こそが、
関数です。
def文を使って関数作る時、引数とコードブロックを与えます。その、引数とコードブロック(=手続きのかたまり)によって表されるものが関数オブジェクトです。
私たちはそのコードブロックをよく"関数本体"と称します。そのことからも明らかです。
関数オブジェクトが持っている手続きのかたまりが本質で、その関数オブジェクトを(ほかの"なにか"と)区別して表すために付ける呼び方が名前です。
それが名前というものの機能です。
def文には、
- 与えられた引数リストとコードブロックから関数オブジェクトを生成する
- 関数オブジェクトに名前を付ける(=def文が実行されたところの名前空間で関数名を関数オブジェクトに束縛する)
という2つの機能がある。と認識するのがいいと思います。
投稿2020/04/21 02:42
編集2020/04/21 02:47総合スコア11202
0
横から失礼いたします。
関数名は、関数オブジェクトの核を 指しています が、核そのものではありません。
それでは関数名の核が関数オブジェクトということになりませんか?
関数名は、変数です。
関数名は変数です。そのため、代入できます。
python
1def f(a, b): 2 return a + b 3 4# 変数 add に代入しても実行できる。 5add = f 6add(1, 1)
>>> add(1, 1) 2 >>>
変数の核は、identity です。
変数はオブジェクトを指しているだけです。関数名はオブジェクトを指しているだけです。ではどうやって指しているのか?というと identity と呼ばれる数字を使って識別しています。
python
1def f(a, b): 2 return a + b 3 4add = f 5 6id(f) 7id(add)
>>> id(f) 4436263120 >>> id(add) 4436263120 >>> >>> # 同じ数字が出力されました。 >>> # つまり変数 f と 変数 add は >>> # 同じものを指しているということです。
まとめ
関数名の核は identity です。関数名は、関数オブジェクトの核を 指しています が、核そのものではありません。
関数名は、名前、変数でしかなく、オブジェクトそのものではないということがポイントです。質問が、指月の譬っぽくて面白いなと思い書かせていただきました笑
投稿2020/04/21 00:12
総合スコア830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
def f(): print("Hello")
したあとg = f
してdel f
してからg()
もできますし、lambda
式を使えば無名関数というものも作れます。
関数名と関数オブジェクトはしょせん変数とオブジェクトの関係です。a = 1
したらa
が1
だと思いますか? 別にa
に関係なく1
は1
です。そんな感じです。
正確に理解するにはオブジェクトが何なのかわかっていないといけないのですが、わかっていたらこの質問は出てこないと思うので、とりあえず比喩的に説明するにとどめています。おいおいわかってくると思うので、とりあえず学習を進めてください。
投稿2020/04/20 16:48
総合スコア30935
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/20 23:13
2020/04/21 01:34
0
Python
1def f(x): return x * 3 2# f は「『引数が x で、x * 3 を返す』という関数オブジェクト」につけられた名前 3 4f = 5 5# f は「値 5 の intオブジェクト」につけられた名前 6 7f = 'abc' 8# f は「値 'abc' の strオブジェクト」につけられた名前
Python では = や def により、オブジェクトの名前の付け替えができます。
名前に型があるのではなく、名前のついた対象のオブジェクトに型があります。
投稿2020/04/21 01:09
編集2020/04/21 01:23総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/21 06:54
2020/04/21 12:01 編集