こちらのサイトにある【関数オブジェクト】についての例題がわからなくて投稿させていただきます。
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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'
- 動作確認用 Repl.it: https://repl.it/@jun68ykt/Q232806
他にも何か、distance
の第3引数に与える関数を自作して動作確認するとよいかもしれません。
参考になれば幸いです。
投稿2020/01/01 07:55
総合スコア9058
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
総合スコア830
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総合スコア5406
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/02 14:39 編集
0
難しく考える必要はありません。順番に関数が実行されるだけ。
返り値がsquare(x-y)???
そのとおりで、square(x-y) を実行した返り値がそのまま返り値になります
投稿2020/01/01 07:18
編集2020/01/01 07:19総合スコア88038
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/02 14:37
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
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
解釈は合っていると思いますよ。
こんな感じで数字や関数を割り当てていけば理解しやすいかと思います。
distance(3,1,square)
⇒ return square(3-1)
⇒ return square(2)
⇒ return 2 * 2
⇒ 4
投稿2020/01/01 07:57
総合スコア10736
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/02 14:39
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/02 14:46
2020/01/02 15:24