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

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

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

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

Q&A

解決済

3回答

325閲覧

関数とreturnの使い方を教えてください。

shinyakita

総合スコア39

Python 3.x

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

0グッド

0クリップ

投稿2018/09/17 11:02

Python3を勉強させていただいております。
複数回乱数を引数にし加算しその合計数を表示するプログラム作成しております
returnの使い方が間違えていると思うのですが呼び出し元でreturnした変数が存在しないとエラーがでてしまいます。

returnはreturn <XX><XX>を呼び出し元に戻すと理解しておりますが間違えてると思うのですが何が間違えているのかわからず
質問させて頂きました。
お知恵をお貸しください。
コードの説明
乱数に3加算して変数aに格納する関数を作成
returnで変数aを呼び元に戻し合計を格納する変数tlに変数aを加算

関数を使うこともないのですが、関数の使い方の勉強中なのでご理解お願い致します。

Python3

1import random 2def func(v): 3 a = v + 3 4 return a 5 6print("10回乱数出します。\n") 7for i in range(1,11): 8 r = random.randint(1,100) 9 print(str(i) + "回目") 10 print("乱数は" + str(r)) 11 print("乱数に3を足すと" + str(a) + "\n") 12  tl = tl + a 13 func(r) #乱数を引数にして関数funcを呼び出し 14print("総合計は" + tl)

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

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

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

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

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

guest

回答3

0

ベストアンサー

原則的には、関数は入力と出力だけ見るべきです。
ここで、関数funcの実装の詳細を全て忘れ去ってみましょう。

Python

1import random 2 3funcは、入力に3を足した数を返す関数です。 4 5 6print("10回乱数出します。\n") 7for i in range(1,11): 8 r = random.randint(1,100) 9 print(str(i) + "回目") 10 print("乱数は" + str(r)) 11 print("乱数に3を足すと" + str(a) + "\n") 12 # tl = tl + a 13 func(r) #乱数を引数にして関数funcを呼び出し 14print("総合計は" + tl)

その上で改めてコードを見てみると、**『aって何?』**と感じると思います。
それが正しい感覚です。

関数は使わなければ意味が無いので、次のようにaの値を取得してやることになります。

Python

1for i in range(1, 11): 2 ... 3 print("乱数は" + str(r)) 4 a = func(r) 5 print("乱数に3を足すと" + str(a) + "\n") 6 ...

もちろん、変数名はaでなくても構いません。

投稿2018/09/17 11:14

編集2018/09/17 11:15
LouiS0616

総合スコア35660

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

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

shinyakita

2018/09/17 11:39

ありがとうございます。 return aで変数aを呼び出し元に戻し変数aとしては利用できないのですね。 returnの使い方が混乱してますね。整理をしないとなりませんね。 メイン側で関数を変数に定義するのですね。 random等と同じですね。当たり前ですよね。 ではreturnはどうやって使うのか?という疑問が出てきました。 また頂いたコード実行したのですが、コメントアウトになっている変数tlの行でtlが見つからないとエラーがでます。 コメントアウト(#)を消して実行しました。
LouiS0616

2018/09/17 11:42

> メイン側で関数を変数に定義するのですね。 細かい点で恐縮ですが、この場合『定義』ではなく『代入』とか『束縛』と呼びます。 おそらく意味合い的には shinyakita さんの解釈で問題ないです。 > tlが見つからないとエラーがでます。 tlはどのように運用したいと思っているのでしょうか?
shinyakita

2018/09/17 11:49

ありがとうございます。 変数なので代入ですね。そうでした。 変数tlは総合計として考えてます。 10回の「乱数+3」の総合計です。
LouiS0616

2018/09/17 11:55

それならば、ループ前に tl = 0 と値を初期化する必要があります。
shinyakita

2018/09/17 12:09

ありがとうございます。 できました。 関数部分でreturnをコメントアウトするエラーが出て、return aをreturn x等に変更してもエラーでます。 returnがどういう動きをするものか混乱してきました。
LouiS0616

2018/09/17 12:14

どのようなエラーメッセージが出ていますか?
shinyakita

2018/09/17 12:28

returnをコメントアウトした場合 E1111:Assigning to function call which doesn't return W0612:Unused variable 'a' retun xとして場合 W0612:Unused variable 'a' というエラーです。 IDEはVS codeを利用してます。
LouiS0616

2018/09/17 12:45

WはWarningの頭文字で、警告は有れど実行を妨げるものではありません。 この場合、せっかく用意した変数を使用していないことが警告されています。 E1111に関しては、return文を単にコメントアウトして出る類のものではありません。 何か別の箇所も一緒に変更していませんか?
shinyakita

2018/09/17 12:56

ありがとうございます。 コメントアウト以外変更してないと思うのですが確認します。
shinyakita

2018/09/17 13:18

変更してませんでした。 わかったことがあります。 returnは変数aを返すのはなく、結果を返すのですね。 returnをコメントアウトすることでメインの関数呼び出しに対し代入する結果なくエラーが出ているようです。 returnがないとa = func(r) ここで変数aに代入するものないのですね。 整理できてようです。 ありがとうございます。
LouiS0616

2018/09/17 13:30 編集

ややこしい話なのですが、returnがない関数は最終行に return None があるものとして扱われます。 ですので、return文を置かないとき a = func(r) は a = None と結果的には同じなのです。 やはりE1111は変です。 これは func(r) = 10 とかやらないと出ないかと思います。
LouiS0616

2018/09/17 13:33

失礼、確認したところE1111が出ました。 直前のコメントの二段落目は無視してください。
shinyakita

2018/09/21 07:47

わざわざ試して頂きありがとうございます。 少しは理解できたと思います。 助かりました。
guest

0

質疑応答白熱してるところ恐縮です。
超シンプル関数作ってみました!
ご参考までにどうぞ。

Python3

1# coding=UTF-8 2def print_msg(msg): 3 print(msg) 4 5 6def calc_add(num_1, num_2): 7 return num_1 + num_2 8 9 10s = "Hello,Function!!" 11print_msg(s) 12 13a = 1 14b = 2 15print(str(a) + " + " + str(b) + " = " + str(calc_add(a, b))) 16

出力結果

Hello,Function!! 1 + 2 = 3

投稿2018/09/17 12:52

opyon

総合スコア1009

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

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

shinyakita

2018/09/17 13:09

ありがとうございます。 この場合はnum_1とnum_2を加算して呼び元に戻しないということですね。 少しわかったような気がします。 再度頭の中整理して別の関数を作って試したいと思います。 関数ではまってしまって先に進めなくなっております。
opyon

2018/09/17 13:13

最初はごくごくシンプルなものを自作してみましょう。 何度も書いてるとこういうことか!って気づく時があります。 あまり焦らずマイペースで良いので納得出来るまでやることですね。
shinyakita

2018/09/17 13:28

はい。 ありがとうございます。 上記のコードでreturnを使い場合 def print_msg(msg): print(msg)  ↓変更後 def print_msg(msg): return msg s = "Hello,Function!!" p = print_msg(s) prtint(p) このようになるのでしょうか? わざわざこんな使い方しないでしょうけどね。
opyon

2018/09/17 13:31

正解です!!
shinyakita

2018/09/17 21:25

ありがとうございます! 理解出来てきたと思います。
guest

0

呼び出し元で、ar+3を格納する処理が抜けていますね。

import random def func(v): a = v + 3 return a print("10回乱数出します。\n") for i in range(1,11): r = random.randint(1,100) print(str(i) + "回目") print("乱数は" + str(r)) a = r + 3 print("乱数に3を足すと" + str(a) + "\n")   tl = tl + a func(r) #乱数を引数にして関数funcを呼び出し print("総合計は" + tl)

投稿2018/09/17 11:18

SatoshiMashino

総合スコア210

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

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

shinyakita

2018/09/17 11:30

わかりました。 それだと関数「func」はどういう動きをするのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問