🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

Q&A

解決済

6回答

1429閲覧

関数に引数として関数を入れる時

kaiserdoragon

総合スコア21

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

0グッド

1クリップ

投稿2020/01/01 07:11

http://bb-biz.com/python-023/

こちらのサイトにある【関数オブジェクト】についての例題がわからなくて投稿させていただきます。

def square(x):

... return x * x
...

def distance(x, y, func):

... return func(x-y)
...

distance(3,1,square) #squareを引数として使用

4

と例題ではあるのですが出力がなぜ4になるとか理解があまり出来ていません。

解釈が間違っているかもしれませんが、distance(3,1,square)とのは

・func⇒square
・関数distanceの返り値はfunc(x-y)
・square⇒square(x)(返り値がx*x)
・squareがdistanceの引数にあてられているから
返り値がsquare(x-y)???

ここからどういう処理が行われて4にたどり着くのでしょうか??

よろしくお願いします。

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

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

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

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

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

guest

回答6

0

こんにちは

関数を引数にとる関数の動作を確認するときは、引数として与えるほうの関数をいろいろ作ってみると分かりやすいかもしれません。
以下サンプルです。

python3

1def distance(x, y, func): 2 return func(x - y)

python3

1def square(x): 2 '''与えられた引数の2乗を返します''' 3 return x * x 4 5def cube(x): 6 '''与えられた引数の3乗を返します''' 7 return x ** 3 8 9def ten_times(x): 10 '''与えられた引数を10倍して返します''' 11 return 10 * x 12 13def zeros(length): 14 '''与えられた引数の数だけ 0 を含むリストを返します。''' 15 return [0] * length 16 17def number_str(n): 18 '''与えられた引数をフォーマットした文字列を返します''' 19 return f'No.{n:03d}'

python3

1print(distance(3, 1, square)) # => 4 2print(distance(5, 2, cube)) # => 27 3print(distance(1, 10, ten_times)) # => -90 4print(distance(5, 1, zeros)) # => [0, 0, 0, 0] 5print(distance(15, 10, number_str)) # => 'No.005'

他にも何か、distance の第3引数に与える関数を自作して動作確認するとよいかもしれません。

参考になれば幸いです。

投稿2020/01/01 07:55

jun68ykt

総合スコア9058

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

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

kaiserdoragon

2020/01/02 14:46

ご丁寧にご回答ありがとうございます!! まだまだ知識量もアウトプットも少ないので、このような関数を変えてみる方法もこれからの学習に使わせていただきたいと思います! そして動作確認用のサイトでの提示もありがとうございます!! お陰で理解ができました!!!!
jun68ykt

2020/01/02 15:24

どういたしまして。 > お陰で理解ができました!!!! とのことでよかったです????
guest

0

ベストアンサー

関数内関数は1つ1つ展開していくと楽かなと...

python

1def square(x): 2 return x * x 3 4def distance(x, y, func): 5 return func(x - y) 6 7distance(3, 1, square) #squareを引数として使用
# Step 0. distance(x = 3, y = 1, func = square) return func(x - y)
# Step 1. distance(3, 1, square) return square(3 - 1)
# Step 2. distance(3, 1, square) return square(2)
# Step 3. distance(3, 1, square) return 2 * 2
# Step 4. distance(3, 1, square) return 4

投稿2020/01/01 09:42

nico25

総合スコア830

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

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

kaiserdoragon

2020/01/02 14:40 編集

ご丁寧にご回答ありがとうございます!! まだプログラミング歴も浅いのでnico25さんのいう通り1つ1つ考えてみるというのをやっていきたいと思います!! この処理が理解できました!ありがとうございます!!
nico25

2020/01/03 10:10

よかったです ^^ ありがとうございます
guest

0

関数の引数は、単純に変数に代入するのと同じです。
数値も関数も全部オブジェクト。変数にオブジェクトIDを代入するだけのこと。

>>> def square(x): ... return x * x ... >>> x = 3 >>> y = 1 >>> func = square >>> func(x-y) 4 >>> type(3) <class 'int'> >>> type(1) <class 'int'> >>> type(square) <class 'function'> >>> id(3) 15912045152 >>> id(1) 15912045088 >>> id(square) 123145296635696 >>> id(x) 15912045152 >>> id(y) 15912045088 >>> id(func) 123145296635696

投稿2020/01/01 08:54

編集2020/01/01 08:59
shiracamus

総合スコア5406

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

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

kaiserdoragon

2020/01/02 14:39 編集

ご回答頂きありがとうございます!! 色々知識を詰め込みすぎて、問題を難しく考えすぎてしまっていたのかもしれません。。。 しかしまだオブジェクトIDという概念もまだ知らないレベルなので、もっと勉強して精進していきます! この処理が理解できました!ありがとうございます!!
guest

0

難しく考える必要はありません。順番に関数が実行されるだけ。

返り値がsquare(x-y)???

そのとおりで、square(x-y) を実行した返り値がそのまま返り値になります

投稿2020/01/01 07:18

編集2020/01/01 07:19
y_waiwai

総合スコア88038

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

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

kaiserdoragon

2020/01/02 14:37

ご回答頂きありがとうございます!! 何か複雑というか難しく考えていたのかもしれません。。 書籍などで勉強を今行っているのですが、このようなパターンがなくまだこのような簡単な応用も効かないので更に努力しきたいと思います!
guest

0

def distance(x, y, func):
return func(x-y)

が、 distance(3,1,square) で呼び出されるのですから、 x, y , func をそれぞれ、 3, 1, square に置き換えます。
すると、

square(3 - 1)

となります。
3 - 1は 2 になるので、

return square(2)

になります。
square(x) は、return x * x です。
x を 2 に置き換えれば、 return 2 * 2 となり、最終的な値は 4 になります。

パラメータで指定された値に 順々に置換、評価を進めていくことで、最終的には単純な処理にたどり着きます。
その結果が return で呼び出し側に返っていくのです。

投稿2020/01/05 01:05

katoy

総合スコア22324

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

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

kaiserdoragon

2020/01/05 17:26

回答いただきありがとうございます!! 一つ一つ細かく処理して考える大切さを学びました! 解決することができました!ありがとうございます!!
guest

0

解釈は合っていると思いますよ。

こんな感じで数字や関数を割り当てていけば理解しやすいかと思います。

distance(3,1,square)
⇒ return square(3-1)
⇒ return square(2)
⇒ return 2 * 2
⇒ 4

投稿2020/01/01 07:57

meg_

総合スコア10736

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

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

kaiserdoragon

2020/01/02 14:39

ご回答頂きありがとうございます!! 頭の中でだけ考えたり、1つ1つの処理を起こしながら勉強していきたいと思います!! この処理が理解できました!ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問