質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

5回答

2829閲覧

関数名が関数オブジェクトなんですか?

Yks.waeq

総合スコア23

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2グッド

4クリップ

投稿2020/04/20 14:38

前提・実現したいこと

Pythonを学習していて関数オブジェクトを教わりました。そこで疑問におもったのがdef (関数名)()
の関数名の部分が関数オブジェクトなんですか?

発生している問題・エラーメッセージ

エラーメッセージはありません。 `` ### 該当のソースコード ```Python ソースコードはありません

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

DrqYuto, Bull👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

本質的に問われるべきは

名前っていったいなんですか?

だと思いました。

あなたは"名前"という概念をどう捉えていますか?

辞書にはこう載ってます。

https://www.weblio.jp/content/%E5%90%8D%E5%89%8D

ある人や事物を他の人や事物と区別して表すために付けた呼び方。


関数の本質は"手続きのかたまり"です。

「あれをやって、これをやって、もしあれがこうなっていた時はこれをして、それがあああなるまでこれを繰り返して、これがこういう状態になったら終了」というような抽象的な手続きを、プログラマはコードとして具体化します。

その中から"意味のある連なり"を取り出して"ひとまとめのかたまり"にしたものが、
「これらの引数をとって、これをやって、もしあれがこうなっていた時はこれをして、それがあああなるまでこれを繰り返して、最後にこの値を返す」というような、抽象的な"手続きのかたまり"こそが、
関数です。

def文を使って関数作る時、引数とコードブロックを与えます。その、引数とコードブロック(=手続きのかたまり)によって表されるものが関数オブジェクトです。
私たちはそのコードブロックをよく"関数本体"と称します。そのことからも明らかです。
関数オブジェクトが持っている手続きのかたまりが本質で、その関数オブジェクトを(ほかの"なにか"と)区別して表すために付ける呼び方が名前です。
それが名前というものの機能です。


def文には、

  1. 与えられた引数リストとコードブロックから関数オブジェクトを生成する
  2. 関数オブジェクトに名前を付ける(=def文が実行されたところの名前空間で関数名を関数オブジェクトに束縛する)

という2つの機能がある。と認識するのがいいと思います。

投稿2020/04/21 02:42

編集2020/04/21 02:47
quickquip

総合スコア11202

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yks.waeq

2020/04/21 06:54

詳しい回答ありがとうございます。コードブロックが関数オブジェクトの本質ならlambda式(lambda 引数1,引数2,‥:式)の式の部分が関数オブジェクトということになりますか?
quickquip

2020/04/21 12:01 編集

> lambda式(lambda 引数1,引数2,‥:式)の式の部分が関数オブジェクトということになりますか? 以下のように確認できるとおり、lambda式(が生成するオブジェクト)=関数(オブジェクト)です。なので質問がどこか変です。 >>> type(lambda x: x) <class 'function'> lambda式は「名前を束縛することなく作れる関数オブジェクト」です。
guest

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

nico25

総合スコア830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

def f(): print("Hello")したあとg = fしてdel fしてからg()もできますし、lambda式を使えば無名関数というものも作れます。

関数名と関数オブジェクトはしょせん変数とオブジェクトの関係です。a = 1したらa1だと思いますか? 別にaに関係なく11です。そんな感じです。

正確に理解するにはオブジェクトが何なのかわかっていないといけないのですが、わかっていたらこの質問は出てこないと思うので、とりあえず比喩的に説明するにとどめています。おいおいわかってくると思うので、とりあえず学習を進めてください。

投稿2020/04/20 16:48

hayataka2049

総合スコア30935

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

やや語弊がありますが、外れてはいません。

リファレンス「8.6. 関数定義」では、

関数定義を実行すると、現在のローカルな名前空間内で関数名を関数オブジェクト (関数の実行可能コードをくるむラッパ) に束縛します。

と書いてあります。
「束縛」というのは、わかりやすく言うと「代入」みたいなことです。
つまり、関数名に関数オブジェクトが代入されているような状態です。

投稿2020/04/20 14:52

otn

総合スコア85762

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yks.waeq

2020/04/20 16:22

関数名を決めて定義した時から関数オブジェクトが関数名に代入されているということですか? それでは関数名の核が関数オブジェクトということになりませんか?
otn

2020/04/20 23:13

> 関数名を決めて定義した時から関数オブジェクトが関数名に代入されているということですか? (代入と束縛の違いを無視すれば)そうです。 > それでは関数名の核が関数オブジェクトということになりませんか? これはどういう意味でしょうか?「核」?
otn

2020/04/21 01:34

本体とか中身という意味であれば、関数オブジェクトが関数の本体です。 関数名は、その関数オブジェクトに付いたラベルです。ラベルなので何枚も貼れます。 def foo(): __return 1 bar = foo baz = foo
guest

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
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問