回答編集履歴

1

追記

2018/05/18 05:25

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -29,3 +29,97 @@
29
29
  『関数を関数に渡す』のと『関数の返り値を関数に渡す』のとでは全く違う結果になります。
30
30
 
31
31
  デコレータの働きは前者、ご提示のコードは後者です。
32
+
33
+
34
+
35
+ 質問追記を受けて
36
+
37
+ ---
38
+
39
+ > 私が書いたコードの場合、...という出力順になるという認識で合っていますでしょうか。
40
+
41
+
42
+
43
+ いちおう確認しておきますが、関数hoge内においてfuncは**呼び出されていません。**
44
+
45
+ ```Python
46
+
47
+ def hoge():
48
+
49
+ print ("名前は、")
50
+
51
+ func # ← 呼び出さないと動かない
52
+
53
+ ```
54
+
55
+
56
+
57
+ また、f2の返り値がf1に与えられているため、**funcの値は実際はNoneです。**
58
+
59
+ その点で、『func=(print("佐藤"))が実行される』という認識はちょっと怪しいです。
60
+
61
+
62
+
63
+ 処理の順序は次のとおりです。
64
+
65
+ 0. f2が引数 "佐藤" を与えられて実行される。
66
+
67
+ **f2の内部では引数 "佐藤" を出力する。**
68
+
69
+ 0. その返り値 None がf1の引数として与えられて実行される。
70
+
71
+ 0. f1内でhogeを定義し、それを引数なしで呼び出したものを返り値とする。
72
+
73
+ **hogeの内部では "名前は、" を出力する。**
74
+
75
+ ここでfuncは呼び出されていないし、そもそも呼び出せない。
76
+
77
+
78
+
79
+ ---
80
+
81
+ > また、以下のようにした場合、期待通りの結果が得られるのですが、どうして上記コードと出力結果が異なるのかが理解できません。
82
+
83
+ > ```Python
84
+
85
+ > def f1(func):
86
+
87
+ def hoge():
88
+
89
+ print ("名前は、")
90
+
91
+ print (func)
92
+
93
+ return hoge()
94
+
95
+
96
+
97
+
98
+
99
+ > def f2(name):
100
+
101
+ return (name)
102
+
103
+
104
+
105
+
106
+
107
+ > f1(f2("佐藤"))
108
+
109
+ > ```
110
+
111
+
112
+
113
+
114
+
115
+ 処理の順序は次のとおりです。
116
+
117
+ 0. f2が引数 "佐藤" を与えられて実行される。
118
+
119
+ 0. その返り値 "佐藤" がf1の引数として与えられて実行される。
120
+
121
+ 0. f1内でhogeを定義し、それを引数なしで呼び出したものを返り値とする。
122
+
123
+ **hoge の内部では "名前は、" を出力する。**
124
+
125
+ **さらに、f1 に与えられた引数 "佐藤" を出力する。**