🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

解決済

2回答

915閲覧

python:関数の中の関数の出力結果について

ttoo

総合スコア126

Python 3.x

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

0グッド

0クリップ

投稿2019/09/15 12:55

def sum(n): if n < 1: return n print(sum(n-1)) sum(3)

上記出力結果が

0 None None

と出力される原因が分からないので教えていただきたいです。

宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

順に追えば、そうなりませんか?

Python

1def sum(n): 2 if n < 1: 3 return n 4 print(sum(n-1))

最初の呼び出しは、n=3
--> n >= 1 なので、 print(sum(3-1))
ここでの戻りは、無し。ただし、呼び出し側も戻り値を見てないので、何も無し。

さて、print()は、sum(2) ...
--> n >=1 なので、print(sum(2-1))
sum()の処理はちょっと於いて、print()の次を考えると、returnが無いので、戻り値無し。 ここでの戻り先は、最初の print(sum(3-1))ですが、sum(3-1) の戻り値が無いので、 Noneですね。
ただ、これは、print()の中でのsum()の処理後なので、最後の Noneに対応。
次の print(sum(2-1))も同じになって、最後の print(sum(1-1))が、0を出力するので、質問の出力となります。

ちょっと説明が分かりにくいかもしれませんが、どうでしょうか。

投稿2019/09/15 13:07

pepperleaf

総合スコア6385

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

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

0

Pythonの関数は、returnせずに脱出するときNoneを返すからです。
つまり次のように書いているのと同じです。

Python

1def sum(n): 2 if n < 1: 3 return n 4 5 print(sum(n-1)) 6 return None # この行は無くても同じだし、単にreturnとだけ書いても良い 7 8sum(3)

sum(0)は0を返しますが、sum(1)とsum(2)はNoneを返しています。

計算結果をその場で捨ててしまうのは再帰処理ではやりがちです。
こんなふうに書いてみると良いでしょう。

Python

1def sum(n): 2 if n < 1: 3 return n 4 5 ret = sum(n-1) 6 print(ret) 7 return ret 8 9sum(3)

なお、関数名はmy_sumなど別の名前に変えた方が無難です。
...と言っても、現状のコードは min(0, n) と動き一緒になっちゃってるんですけどね。

投稿2019/09/15 13:02

編集2019/09/15 13:06
LouiS0616

総合スコア35668

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問