回答編集履歴
1
追記
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 に与えられた引数 "佐藤" を出力する。**
|