質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

関数

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

Python

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

Q&A

解決済

3回答

2041閲覧

Python デコレータ、関数内関数について

miga

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

関数

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

Python

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

0グッド

0クリップ

投稿2018/05/18 03:47

編集2018/05/18 05:09

python

1def f1(func): 2 def hoge(): 3 print ("名前は、") 4 func 5 return hoge() 6 7 8def f2(name): 9 print (name) 10 11 12f1(f2("佐藤")) 13

上記のコードで、実行結果が以下のようになってしまうのはなぜでしょうか。
佐藤
名前は、

hoge関数内の実行順で出力されることを期待していたのですが...

LouiS0616さん
追加で質問させていただいてよろしいでしょうか。

私が書いたコードの場合、f1(f2("佐藤"))によって、func=(print("佐藤"))が実行されるため、この時点で、「佐藤」が出力され、その後hoge関数によって「名前は、」が出力されため、
佐藤
名前は、
という出力順になるという認識で合っていますでしょうか。

また、以下のようにした場合、期待通りの結果が得られるのですが、どうして上記コードと出力結果が異なるのかが理解できません。

python

1def f1(func): 2 def hoge(): 3 print ("名前は、") 4 print (func) 5 return hoge() 6 7 8def f2(name): 9 return (name) 10 11 12f1(f2("佐藤")) 13

初歩的な質問で申し訳ありませんが、ご回答いただけると幸いです。

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

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

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

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

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

quickquip

2018/05/18 10:49

タイトルから「デコレータ」の語を削除しておいた方が良さそうですね。もう変更できないようなら、質問の冒頭に追記しておくべきかと。
guest

回答3

0

やりたいのはこんな感じなのかなぁ。

python

1In [9]: def f1(func): 2 ...: def hoge(name): 3 ...: print ("名前は、") 4 ...: func(name) 5 ...: return hoge 6 ...: 7 ...: @f1 8 ...: def f2(name): 9 ...: print (name) 10 ...: 11In [10]: f2("佐藤") 12名前は、 13佐藤

投稿2018/05/18 03:53

tachikoma

総合スコア3601

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

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

0

ベストアンサー

f2を実行した返り値を、f1に渡しているからです。
ついでに記述が無駄になっている部分を省くと、次のように書いているのと同じです。

Python

1def f1(func): 2 print ("名前は、") 3 4def f2(name): 5 print (name) 6 7 8f2_result = f2("佐藤") 9f1(f2_result)

『関数を関数に渡す』のと『関数の返り値を関数に渡す』のとでは全く違う結果になります。
デコレータの働きは前者、ご提示のコードは後者です。

質問追記を受けて

私が書いたコードの場合、...という出力順になるという認識で合っていますでしょうか。

いちおう確認しておきますが、関数hoge内においてfuncは呼び出されていません。

Python

1def hoge(): 2 print ("名前は、") 3 func # ← 呼び出さないと動かない

また、f2の返り値がf1に与えられているため、funcの値は実際はNoneです。
その点で、『func=(print("佐藤"))が実行される』という認識はちょっと怪しいです。

処理の順序は次のとおりです。
0. f2が引数 "佐藤" を与えられて実行される。
f2の内部では引数 "佐藤" を出力する。
0. その返り値 None がf1の引数として与えられて実行される。
0. f1内でhogeを定義し、それを引数なしで呼び出したものを返り値とする。
hogeの内部では "名前は、" を出力する。
ここでfuncは呼び出されていないし、そもそも呼び出せない。


また、以下のようにした場合、期待通りの結果が得られるのですが、どうして上記コードと出力結果が異なるのかが理解できません。

Python

1def f1(func):
def hoge(): print ("名前は、") print (func) return hoge()

def f2(name):

return (name)

f1(f2("佐藤"))

処理の順序は次のとおりです。
0. f2が引数 "佐藤" を与えられて実行される。
0. その返り値 "佐藤" がf1の引数として与えられて実行される。
0. f1内でhogeを定義し、それを引数なしで呼び出したものを返り値とする。
hoge の内部では "名前は、" を出力する。
さらに、f1 に与えられた引数 "佐藤" を出力する。

投稿2018/05/18 04:23

編集2018/05/18 05:25
LouiS0616

総合スコア35660

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

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

miga

2018/05/18 05:08

追加で質問させて頂きましたので、ご確認いただけると幸いです。
miga

2018/05/18 10:29

納得しました!ありがとうございます。 基本的な知識が足りなかったようです。
guest

0

何がしたかったのか推測する合戦になってますが。

def f1(func): def hoge(arg): print ("名前は、") func(arg) return hoge def f2(name): print(name) f1(f2)("佐藤")

結果

名前は、 佐藤

実態はtachikomaさんの回答と変わりありません。
f1は引数の名前から言っても関数を渡されることを期待していますね。f1(f2)と呼び出すことで関数が返ってきますから、f1(f2)(なにか引数)が関数呼び出しになります。

投稿2018/05/18 04:36

編集2018/05/18 04:37
quickquip

総合スコア11038

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問