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

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

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

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

Python

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

Q&A

解決済

3回答

5456閲覧

Pythonでreturnの使い方がわからない

rickey

総合スコア24

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/03/16 23:46

編集2018/03/17 00:03

前提・実現したいこと

Aidemyというサイトを使用してPythonの勉強を始め、
defで関数を呼び出すこと学びました。
その中で、 return print それぞれをどのように使うかで出力結果が異なったり、
エラーになったり、フリーズ?したりするのですか。なぜこうなっているのかがわかりません。
それぞれについてなぜなのかわかりましたら教えてください。
(どれか一つでもよいのでわかったら教えてください)。
なお@はこのサイトでインデントがわかるように入れています(コードではありません)
出題のURL
https://aidemy.net/courses/3010/exercises/BJcY4tlwef

(1)おそらく正解
def bmi(height, weight):
@@@@keisan=weight / height**2

@@@@print("%.2f" %keisan)

bmi(1.74,80)

出力結果26.42

(2)なぜか出力は、Out[1]とでた。printで出力された結果と異なるのはなぜか?
小数点2桁にも絞れていないのはなぜか?
def bmi(height, weight):
@@@@keisan=weight / height**2
@@@@return(keisan)
@@@@print("%.2f" %keisan)

bmi(1.74,80)

出力結果
Out[1]: 26.42356982428326

(3)これも正解のようですが、(1)とどう使い分けるのでしょうか?
def bmi(height, weight):
@@@@keisan=weight / height**2
@@@@return(keisan)

print("%.2f" %bmi(1.74,80))

出力結果
26.42

(4)これはエラーが出てしまいます。retuenが無いからという気はするのですが、
returnがないと何故出力されないのでしょうか?
def bmi(height, weight):
@@@@keisan=weight / height**2

print("%.2f" %bmi(1.74,80))

(5)これは何も出力されないのですが、何故なのでしょうか?
def bmi(height, weight):
@@@@keisan=weight / height**2
@@@@return(keisan)
@@@@print("%.2f" %bmi(1.74,80))

何も出力されない

(6)なぜか出力は、Out[1]とでた。printで出力された結果と異なるのはなぜか?
小数点2桁にも絞れていないのはなぜか?
def bmi(height, weight):
@@@@keisan=weight / height**2
@@@@return(keisan)
@@@@print("%.2f" %bmi(1.74,80))

bmi(1.74,80)

出力結果
Out[1]: 26.42356982428326

(7)エラーメッセージはでなく、ずっと実行させようとしてフリーズしてしまいます。
ループしてる?何が起きていて、何が悪いのでしょうか?
def bmi(height, weight):
@@@@keisan=weight / height**2

@@@@print("%.2f" %bmi(1.74,80))

bmi(1.74,80)

実行結果
エラーメッセージなく実行が失敗

発生している問題・エラーメッセージ

(4)のエラーメッセージ
TypeErrorTraceback (most recent call last)
<script.py>()
2     keisan=weight / height**2

----> 4 print("%.2f" %bmi(1.74,80))

TypeError: must be real number, not NoneType

エラーメッセージ

該当のソースコード

Python

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

ベストアンサー

次の三点を抑えておけば良いかと。

  • returnより後に処理を書いてはいけない
  • returnがない場合、return Noneが略されているものとみなされる
  • 対話環境は、printせずとも値を出力してくれてしまうことがある (便利ではある)

問題点
(2) printより前にreturnを使ってしまっている
(4) 自動的にreturn Noneされているが、浮動小数として解釈できない
(5) 外部から関数を呼び出していないように見える
(6) 2と同様
(7) 関数が自分自身を呼び出しているので、無限再帰している

(1)と(3)の違い
(1) 関数内で出力処理を行っている
(3) 関数の返り値を出力している

後者の方が機能がミニマムなので管理しやすいです。


(3)の書き方をしっかりマスターしてください。
その他の記法の原因は、学習が進めば自然に分かってくるように思います。

コードの書き方について

既にumyuさんが指摘しておられますが、こちらにも書いておきます。

teratailには、コードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。

例えば次のように表示できます。

Python

1for i in range(3): 2 print('Hello World!')

投稿2018/03/17 05:49

編集2018/03/17 10:07
LouiS0616

総合スコア35660

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

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

rickey

2018/03/17 22:47

わかりやすく解説してくださりありがとうございます。 ①③のようにどちらも答えが得られる場合、どちらが理想の書き方なのかがわからなかったので、③のほうがいい書き方とわかって、本当によかったです。 関数内で出力処理をするような書き方(関数内にprintが入っている)よりも、 関数はreturnで終わらせて、返り値を出力できるように(外部から関数を呼び出すところでprintを書く。インデントを入れてないところでprintを書き返り値を出力する。という表現で合ってますか?)すればいいんですね。
LouiS0616

2018/03/18 00:21

(1)の書き方が間違いというわけではないですが、呼び出す度に出力が発生してしまいます。 出力を主目的とする関数なら問題ないですが、そうでないときは使いづらいだけです。
guest

0

2)は僕の環境では実行されません。文法が間違ってます
returnが実行されるとその後の処理は無視されます。
改行をしてインデントを減らし関数から抜けないとこのprintは実行されません。

3)の出力結果の違いは
フォーマット指定子の関係です
2は文法が間違ってますが以下のようにすることで出力されます
def bmi(height, weight):
....keisan = weight / height**2
....return(keisan)

print(bmi(1.74,80))
print("%.2f" % bmi(1.74,88)) か
print("{:.2f}".format(bmi(1.74, 88))にすることで同じ結果が得られます
.2fというのは実数で小数点第2位まで表わせという意味です

4)は仰るとおりです
returnは関数の結果を戻す役割なのでkeisanなり何かを戻さないといけません。

5)returnが実行されるとその後の処理は無視されます。

def bmi(height, weight):
....keisan = weight / height**2
....if keisan < 0:
........return height // 条件に合致しないので無視
....else:
........return keisan // 条件に合致するのでreturnで返される
....return weight // 既にreturnが実行されたので無視
returnは実行された時点でその他の処理は無視されます

6)も1、5と似てますね
出力されるとは思いませんが出力されたとしたら
print("%.2f" % bmi(1.74,80))
としたのだと思います

7)は再帰処理というやつで関数内でその関数自身を呼び出し終わりの無い処理を続けているので終わらないのです。
環境にもよるのかもしれませんが以下のようなエラーメッセージが出ると思います
RecursionError: maximum recursion depth exceeded
おんなじこと繰り返し過ぎだよもう無理!と怒られてます
確か1度に1,000回くらいまでしか関数は繰り返し処理を使えないと思います

投稿2018/03/17 09:46

編集2018/03/17 10:00
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

rickey

2018/03/17 22:53

どう訂正するかを詳細に書いてくださってありがとうございます。 関数の中にreturnを書いておく。その後は出力されないから、printを書いてもダメ。 ⑦のように自分自身を呼び出すような関数を、関数内に書いてはダメってことですね。 何故だか、どう直すかがわかりました。ありがとうございました。
rickey

2018/03/17 22:53

どう訂正するかを詳細に書いてくださってありがとうございます。 関数の中にreturnを書いておく。その後は出力されないから、printを書いてもダメ。 ⑦のように自分自身を呼び出すような関数を、関数内に書いてはダメってことですね。 何故だか、どう直すかがわかりました。ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/03/17 23:36

関数内で自分自身を呼び出して使う使用法はたくさん有りますので ダメではないですよ 使い方を間違ってなければの話ですけど
guest

0

return はたんに関数の戻り値を返す命令です
そこに並んでる疑問は、あんましreturn には関係ないかと。


(2)

@@@@return(keisan)
@@@@print("%.2f" %keisan)

return のところで関数から抜けてしまうので、このprintは実行しません

(3)

print("%.2f" %bmi(1.74,80))

関数 bmi を呼び出してその戻り値を表示しています

(4)
bmi 関数に戻り値が設定されてませんので、printの行でエラーですね

(5)

@@@@return(keisan)
@@@@print("%.2f" %bmi(1.74,80))

(2 の場合と同じで、returnで関数から抜けるのでprintは実行されません

(6)
結果が表示されるのがおかしいw
(7)
printの中でbmi関数自身を呼んでるので無限ループになってしまっている


(2 と(6 で表示されるOut[1]: ってのは実行環境が出してるなんかのメッセージでは?

投稿2018/03/17 00:33

編集2018/03/17 01:15
y_waiwai

総合スコア87747

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

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

rickey

2018/03/17 22:37

急ぎ回答くださりありがとうございます。 returnをすると関数から抜けるから、次のprintが実行されない。 ということなんですね。 7が無限ループなのも、また関数自身を呼び出しているからと、いうことで理解できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問