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

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

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

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

Q&A

解決済

3回答

801閲覧

初学者です。書いたコードがなぜ出力しないのかわかりません。

haru0

総合スコア5

Python

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

0グッド

0クリップ

投稿2022/08/08 05:05

編集2022/08/08 05:22

前提

ここに質問の内容を詳しく書いてください。

初学者です。次のコードが何故動かないのかわかりません。

実現したいこと

比べたい

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

エラーメッセージ

エラーが出ない。

該当のソースコード

python

1def f1(a=10, b=10): 2 while True: 3 if a > b: 4 return f1(a, b) 5 else: 6 return f1(b, a)

試したこと

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

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

いまいちreturnの意味、役割が理解しきれていません。

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

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

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

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

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

jbpb0

2022/08/08 05:07

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください または、 https://teratail.storage.googleapis.com/uploads/contributed_images/56957fe805d9d7befa7dba6a98676d2b.gif を見て、そのようにしてみてください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
melian

2022/08/08 05:12

例えば、 f1() を実行すると、無限ループ(infinite recursive call)になります。任意のパラメータを入れても同様です。
jbpb0

2022/08/08 06:44 編集

質問に記載のコードは、「return f1(a, b) 」で自分(f1)自身を実行してます それがさらに自分自身を実行して、、、が永久に繰り返されます このコードでやりたいことは何でしょうか? たとえば「a > b」の場合は、本当は「何を」関数から「return」したいのでしょうか? 「return」したい「何か」を、素直にそのまま「return」すればいいのですけど
guest

回答3

0

defは関数を定義する命令で、defの中でreturnするとそれ以降の関数内の処理を中断して、returnで指定してる値を呼び出し元に返します。
returnした値を出力したい場合は別途print関数で出力する必要があります。

//関数定義 def sample(arg): return 'sampletext' //関数を呼び出して、returnされた文字列を出力 print(sample()) //'sampletext'

投稿2022/08/08 05:41

tanakataxi

総合スコア27

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

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

0

ある条件を満たす限り同じ処理を続けたい場合なら
while文を使う事になると思います。

しかし、a=10,b=15のように
代入する値が変化しないのならば、無限ループを起こしやすいwhile文は特に必要ないと思われます。
returnも返すべきものが特に無さそうです。


ゴチャッとして見えますが、番号順に読めば流れが分かると思います。👇

Python

1import random #【0】 2 3def f0(hantei): #【12】 4 if hantei == "A": # "A"が代入されている場合は 【13】 5 print("aはbより大きい\n") #これをプリント。 【14】 6 elif hantei == "B": 7 print("aはbより小さい\n") 8 else: 9 print("aとbは等しい\n") 10 11#================================ 12 13def f1(a,b): # ランダムな数字が代入された a と b を受け取る。【8】 14 if a > b: #【9】 15 print(f"a={a} > b={b}") #【10】 16 return f0("A") # もし a > b なら、 f0(hantei)の hantei に "A"を代入して返す【11】 17 elif a < b: 18 print(f"a={a} < b={b}") 19 return f0("B") 20 else: 21 print(f"a={a} = b={b}") 22 return f0("C") 23 24#================================ 25 26 27count = 0 #カウンターを作ります。【1】 28 29while True: #条件式が無いのでずっとTrue。止める条件が無いと無限ループになる恐れ。【2】 30 count = count + 1 #一回の処理につき「1」を足す。【3】 31 if count <= 5: #もしカウントが「5」以下だったら👇以下の処理をし続ける。【4】 32 a = random.randint(1,10) # 1〜10のどれか【5】 33 b = random.randint(1,10) # 1〜10のどれか【6】 34 f1(a,b) #ランダムに出した数を a と b に代入して f1() に渡します。【7】 35 else: 36 break # count が5より大きくなるような事があれば、繰り返しを強制的に中断。 37 38#================================ 39 40#出力結果(毎回異なる) 41""" 42a=8 > b=1 43aはbより大きい 44 45a=3 > b=2 46aはbより大きい 47 48a=9 = b=9 49aとbは等しい 50 51a=4 < b=6 52aはbより小さい 53 54a=10 > b=5 55aはbより大きい 56""" 57#正しく処理されました。

投稿2022/08/08 06:52

編集2022/08/09 01:18
Plasma

総合スコア17

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

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

haru0

2022/08/15 06:40

無茶苦茶丁寧で分かりやすい解説ありがとうございます。
guest

0

ベストアンサー

そりゃそうだろうとしか…

まず、プログラミングって「こう書けばいい」ってものではありません
ロジックを生合成を保ったまま書き下すことです。

コードを読みましょう。コードを読むコツは、「一行レベルで読む」です。

# 関数f1を定義(引数はa,bで省略時はそれぞれ10) def f1(a=10, b=10): # Trueの間(= 無限ループ) while True: # aの値がbより大きいなら if a > b: # 再帰的に自身の関数を呼び出す(引数は同じで) return f1(a, b) # それ以外なら else: # 再帰的に呼び出す(ただしa,bを入れ替えた状態で) return f1(b, a)

これを実際に値を入れてシミュレーションしてみてください。

仮にf1()とすると、引数a,bの値はどうなるでしょうか。
a = 10, b = 10ですね。

じゃあ、while True:で処理します。True = True なので 処理。
if a > b:を処理します。aとbの値はなんでしょうか。
そう、現時点ではどちらも10。つまり 10 > 10 となっていますね。
これは正しいでしょうか。10は10より大きいでしょうか。
違いますよね。なので中の処理はせずに次のelseとかにいく。

elseでは上記のifの条件を満たさない場合に行われます。
なので処理。処理内容は「a,bの値を入れ替えて再帰的に呼び出す」でしょうか。
でもaとbの値ってなんでしょうか。
両方とも10ですね。f1(10,10)の引数を入れ替えてもf1(10,10)のはずです。
つまり変更なし。

で、f1関数、つまり自分を呼び出す。
となると、f1関数が再度呼び出されてf1(10,10)で最初の処理と同じようにやっていく。

…でも引数の値は何も変化していないはずなので「終了」が不可能。

そりゃあ、無限ループに陥りますって…

—-

[追記0]

まずは基礎からやりましょう。
基礎を蔑ろにする人は上達しませんし、理解もできないはずです。

returnの役割は「戻り値を返すこと」です。

そもそも関数っていうのは、「ある処理をしてもらい、その結果を受け取る」ためのものです。数学の関数 f(x) = x + 1 とかみたいなものと一緒です。
ブラックボックス化されたf(x)に、値 2 とかを入れると x + 1 とかの計算がされてその結果の3とかが返ってくるかんじです。

入門書とかだと関数内でprintされていることが多いので意味がなさそうですが、
たとえば数学で言えば二次関数の解を求める公式とかみたいにめんどくさそうな計算式があって、それを毎回使う場合、それを手打ちでやるの面倒ですよね。
そこで「二次関数の解を求める関数」を作っておけばそれに引数を渡せば勝手に計算してくれてその結果を渡してくれる。

それ以外にも複雑な処理をひとまとめにして関数としていれば、
その関数を呼び出すだけで済む。
本来なら一回の処理に十何行という行数のコードを書かないといけないものをたった一行程度で済む…みたいにできる。

その処理結果を呼び出し元に渡したいですよね。その呼び出し元に返す(つもりの)データを「戻り値」といいます。
その戻り値を呼び出し元に渡す処理(戻り値を返すともいう)をするためにreturnをつかって行う。

たとえばreturn 1とすれば「戻り値として1を呼び出し元に渡す」という感じに。

つまり、質問にあるreturn f1(a,b)とかは、「関数f1にa,bを渡してその結果を(受け取り)、この関数を呼び出したところに渡す」的な感じですかね。

投稿2022/08/08 06:26

編集2022/08/08 06:40
BeatStar

総合スコア4958

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

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

haru0

2022/08/15 06:42

戻り値に関して教えてくださってありがとうございます。いまいちprintとの違いが分からなかったのですが、少し分かった気がします。またよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問