teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2018/05/18 05:25

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -13,4 +13,51 @@
13
13
  ```
14
14
 
15
15
  『関数を関数に渡す』のと『関数の返り値を関数に渡す』のとでは全く違う結果になります。
16
- デコレータの働きは前者、ご提示のコードは後者です。
16
+ デコレータの働きは前者、ご提示のコードは後者です。
17
+
18
+ 質問追記を受けて
19
+ ---
20
+ > 私が書いたコードの場合、...という出力順になるという認識で合っていますでしょうか。
21
+
22
+ いちおう確認しておきますが、関数hoge内においてfuncは**呼び出されていません。**
23
+ ```Python
24
+ def hoge():
25
+ print ("名前は、")
26
+ func # ← 呼び出さないと動かない
27
+ ```
28
+
29
+ また、f2の返り値がf1に与えられているため、**funcの値は実際はNoneです。**
30
+ その点で、『func=(print("佐藤"))が実行される』という認識はちょっと怪しいです。
31
+
32
+ 処理の順序は次のとおりです。
33
+ 0. f2が引数 "佐藤" を与えられて実行される。
34
+ **f2の内部では引数 "佐藤" を出力する。**
35
+ 0. その返り値 None がf1の引数として与えられて実行される。
36
+ 0. f1内でhogeを定義し、それを引数なしで呼び出したものを返り値とする。
37
+ **hogeの内部では "名前は、" を出力する。**
38
+ ここでfuncは呼び出されていないし、そもそも呼び出せない。
39
+
40
+ ---
41
+ > また、以下のようにした場合、期待通りの結果が得られるのですが、どうして上記コードと出力結果が異なるのかが理解できません。
42
+ > ```Python
43
+ > def f1(func):
44
+ def hoge():
45
+ print ("名前は、")
46
+ print (func)
47
+ return hoge()
48
+
49
+
50
+ > def f2(name):
51
+ return (name)
52
+
53
+
54
+ > f1(f2("佐藤"))
55
+ > ```
56
+
57
+
58
+ 処理の順序は次のとおりです。
59
+ 0. f2が引数 "佐藤" を与えられて実行される。
60
+ 0. その返り値 "佐藤" がf1の引数として与えられて実行される。
61
+ 0. f1内でhogeを定義し、それを引数なしで呼び出したものを返り値とする。
62
+ **hoge の内部では "名前は、" を出力する。**
63
+ **さらに、f1 に与えられた引数 "佐藤" を出力する。**