アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラミング初心者です。pythonを勉強しています。
戻り値というのがよくわかりません。
・自動販売機でいうと、お金が引数で、出てくるジュースが返り値
・返り値はほかの関数でも再利用できるようにするもの
という説明をうけました。
それならばなぜ、以下のコードで変数mpgが宣言されてない、と言われるのでしょうか?
関数calculate_miles_per_gallonの中で宣言されていますよね?それをprint関数で再利用しているものと思っているのですが。
def calculate_miles_per_gallon(miles_driven, gallons_used):
mpg=miles_driven / gallons_used
mpg = round(mpg ,1)
return mpg


miles = 500
gallons = 14
calculate_miles_per_gallon(miles,gallons)
print (mpg)


よろしくお願いします。

A 回答 (6件)

市役所などの自治体が行っているパソコン相談で相談したほうが良いと思います。

    • good
    • 0

私はExcelのマクロがpythonになったら勉強しようかと思っているところですが、pythonって他のいろんな言語と同じくローカル変数とグローバル変数の概念があり、関数内で定義なり宣言した変数はローカル変数になるから、その関数内でしか通用しません。

なので関数の外からその値を見ることはできません。

それに変数mpgは関数の戻り値に格納されている、すなわち関数calculate_miles_per_gallonを参照すれば、その値がゲットできます。なもんで…

calculate_miles_per_gallon(miles,gallons)
print (mpg)

ではなく、

print (calculate_miles_per_gallon(miles,gallons))

と書けば良いのでは?
    • good
    • 0

変数のスコープというものを既に勉強されていますか?


それを知っていれば理解できると思います。

関数calculate_miles_per_gallonの定義の中にある変数mpgは
関数内のローカル変数であり、print(mpg)の変数とは別ものです。




----test.py (段付の為全角スペースを使用しているので実行時は要置換)
def calculate_miles_per_gallon(miles_driven, gallons_used):
  mpg=miles_driven / gallons_used
  mpg = round(mpg ,1)
  return mpg

# ↑ここまで関数の定義、ここまでのmpgはローカル変数であり関数の中にしか存在しないので
#  MAIN処理からは見えない


# ↓ここからMAIN処理(関数を呼んで戻り値を表示する)
miles = 500
gallons = 14
mpg = calculate_miles_per_gallon(miles,gallons) # 関数の戻り値をMAINの変数mpgに代入
print(mpg) # 関数の戻り値を代入しないと、いきなり登場したmpg(値不明)の値を表示させることになる
---- ここまで
    • good
    • 0
この回答へのお礼

なるほど、ありがとうございます!
関数内で宣言された変数は外では使えないというとこは理解しました。
ついでで一つ質問してもよろしいでしょうか
変数MPGが関数外で使えないのであれば、「return」が返しているのは
「変数mpg」ではなく、関数calculate_miles_per_gallon()で宣言された変数mpgの中に入っている数値「そのもの」
という理解でよろしいでしょうか?

お礼日時:2018/09/12 09:54

> 戻り値というのがよくわかりません。


> ・自動販売機でいうと、お金が引数で、出てくるジュースが返り値
> ・返り値はほかの関数でも再利用できるようにするもの
> という説明をうけました。

こういう訳の分からない説明になっていない話をするから聞く側は理解できない。。。(^^;
Pythonでは処理のかたまりを「関数」というものにすることが出来ます。
関数には名前があって、その関数の機能を使いたい側は名前を指定して呼び出します。
関数での処理結果を呼び出し元へ返す(教える)方法にはいろんな方法がありますが、その一つが「戻り値」です。
一般にはその関数の処理が正常終了したか異常終了したかを伝えるのに使用することが多いです。
以下の説明が参考になるでしょう。

https://www.sejuku.net/blog/40791


> それならばなぜ、以下のコードで変数mpgが宣言されてない、と言われるのでしょうか?

これは以下の部分での変数未宣言のエラーを言われていますね?

> calculate_miles_per_gallon(miles,gallons)
> print (mpg)


でしたらこれと関数の戻り値は何も関係ありません。
これは「ある場所で宣言された変数の使用範囲」(←スコープと言います)のお話です。
で、「関数の中で宣言された変数」(←ローカル変数)はその関数の中でしか使用できません。
ですからある関数が返した戻り値を、その関数を呼び出した側で変数に受け取る際、その変数は呼び出し元で宣言されているか、そのプログラム内であればどこからでも使用(代入&参照)出来るグローバル変数でなければなりません。

非常に基本的なところを理解されないまま学習を進めておられるようにお見受けしますので、Pythonの入門書か解説書を購入していつでも多ページを参照できるようにして学習されるのがよいと思います。
初心者用の解説をしているWebサイトも多くありますが、やはり本があった方が勉強しやすいと考えます。

参考まで。
    • good
    • 0

No.3です。



> 変数MPGが関数外で使えないのであれば、「return」が返しているのは
> 「変数mpg」ではなく、関数calculate_miles_per_gallon()で宣言された変数mpgの中に入っている数値「そのもの」
> という理解でよろしいでしょうか?

その通りです。
    • good
    • 0

関数に間違いはないし、戻り値の戻し方もこれでいいんですが


使い方が違う。

miles = 500
gallons = 14
print(calculate_miles_per_gallon(miles,gallons))

とすると 35.7142 とか表示されます。

変数mpgを戻すんじゃなくてmpgの値を戻す。わかりますか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!