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

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

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

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

Q&A

解決済

2回答

1183閲覧

returnの位置について

hamazon

総合スコア16

Python

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

0グッド

4クリップ

投稿2020/05/22 03:33

編集2020/05/22 06:08

関数が呼び出された時に'start'、終了した時に'end'と表示するtestというデコレータを定義しよう(O'REILLYの入門 python3 P136復習課題4-10より)

関数new_funcの処理結果であるresultをstartとendの間に表示しようと考え、print(end)の前にresultが戻り値として表示されるよう組んだのですが、以下のようになりendが表示されなくなってしまいます。

python3

1>>> def test(func): 2... def new_func(*args, **kwargs): 3... print('start') 4... result = func(*args, **kwargs) 5... return result 6... print('end') 7... return new_func 8... 9>>> @test 10... def greeting(): 11... print('Hello') 12... 13>>> greeting() 14start 15Hello

試したこと

解答のコードは以下のようになっており、returnをprint('end')の後ろに持ってくる、というものでした。自分の感覚では、この位置にreturnを書くと、endの後にresultが表示されてしまう(start→end→resultの順)のでは?と考えたのでどうも納得いきません...returnの持つ意味と記述する位置について教えて頂けますと幸いです。

python3

1>>> def test(func): 2... def new_func(*args, **kwargs): 3... print('start') 4... result = func(*args, **kwargs) 5... print('end') 6... return result 7... return new_func 8... 9>>> @test 10... def greeting(): 11... print('Hello') 12... 13>>> greeting() 14start 15Hello 16end 17``` 18 19 20### 補足情報(FW/ツールのバージョンなど) 21 22ここにより詳細な情報を記載してください。

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

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

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

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

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

Lhankor_Mhy

2020/05/22 03:55

def new_func(*args, kwargs): は、 def new_func(*args, **kwargs): ではないですか?
hamazon

2020/05/22 05:54

ご指摘ありがとうございます。 おっしゃる通り、kwargs→**kwargsの間違いでした。 ターミナルからそのままコピペして貼り付けたのですが、サイト上では仕様が変わってしまうのですね...気をつけます!
guest

回答2

0

ベストアンサー

コードの挙動として、greeting() を呼び出したとき以下の順序で実行されます。

  1. 引数 funcgreeting() が渡されて、test() が呼び出される。(つまり、func = greeting())
  2. print("start")start が出力
  3. func(*args, **kwargs)、つまり、greeting(*args, **kwargs) が呼び出される。
  4. greeting() 内の print("Hello") で Hello が出力
  5. print("end")end が出力

詳細はデコレーターの仕組みについて理解する必要があります。

Pythonのデコレータについて - Qiita

python

1def test(func): 2 def new_func(*args, **kwargs): 3 print("start") 4 result = func(*args, **kwargs) 5 print("end") 6 7 return new_func 8 9 10@test 11def greeting(): 12 print("Hello") 13 14 15greeting()

質問の1つ目のコードで return したら end が表示されなくなった理由は

  1. 引数 funcgreeting() が渡されて、test() が呼び出される。(つまり、func = greeting())
  2. print("start")start が出力
  3. func(*args, **kwargs)、つまり、greeting(*args, **kwargs) が呼び出される。
  4. greeting() 内の print("Hello")Hello が出力
  5. return resulttest() 関数が終了する

となり、return より後の print("end") が実行されなくなったためです。

python

1def test(func): 2 def new_func(*args, **kwargs): 3 print("start") 4 result = func(*args, **kwargs) 5 return result 6 print("end") 7 8 return new_func 9 10 11@test 12def greeting(): 13 print("Hello") 14 15 16greeting()

投稿2020/05/22 03:49

編集2020/05/22 03:51
tiitoi

総合スコア21956

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

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

hamazon

2020/05/22 06:00

なるほど! ①greeting()の中のprint('Hello')が実行されて、その後にtest関数のprint('end')が実行される ②returnを実行するとそれ以降の関数内の処理が実行されない という事ですね!大変わかりやすく助かりました。ありがとうございました!
guest

0

endの後にresultが表示されてしまう(start→end→resultの順)のでは?と考えた

まさにそのとおりです。

python

1def test(func): 2 def new_func(*args, **kwargs): 3 print('start') 4 result = func(*args, **kwargs) 5 print('end') 6 return 'result' # 変更 7 return new_func 8 9@test 10def greeting(): 11 print('Hello') 12 13print( greeting() ) # 変更 14 15""" 16start 17Hello 18end 19result 20"""

ちなみに、return文を実行すると、その後のコードは無視して関数を終了しますので、returnをprint('end')の前にすると実行されません。

投稿2020/05/22 03:59

編集2020/05/22 04:33
Lhankor_Mhy

総合スコア36960

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

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

hamazon

2020/05/22 06:02

return文を実行するとその後のコードは実行されないという事ですね! そこの理解が足りていませんでした。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問