プロが教えるわが家の防犯対策術!

※当該コードは質問最下部に記載しております。

じゃんけんをするコードについて、

my_hand = get_my_hand()
you_hand = get_you_hand()
hand_diff = my_hand - you_hand

と記載がありますが、

get_my_hand()
get_you_hand()
hand_diff = get_my_hand() - get_you_hand()

と記載してはダメな理由を教えていただきたいです。
端的に申し上げますと、なぜget_my_hand()をmy_handに置き換える必要があるのかが理解出来ていないのです。
今週gaccoにてPythonの学習を始めたばかりのため馬鹿げた質問でしたら申し訳ございませんが、よろしくお願いいたします。

【コード】
import random

def start_message():
print('じゃんけんスタート')

def get_my_hand():
print('自分の手を入力してください')
return int(input('0:グー, 1:チョキ, 2:パー'))

def get_you_hand():
return random.randint(0, 2)

def view_result(hand_diff):
if hand_diff == 0:
print('あいこ')
elif hand_diff == -1 or hand_diff == 2:
print('勝ち')
else:
print('負け')

start_message()

my_hand = get_my_hand()
you_hand = get_you_hand()
hand_diff = my_hand - you_hand

view_result(hand_diff)

A 回答 (4件)

極論、こう書いても構わない。



https://www.ideone.com/U5eezp

だから、

> 端的に申し上げますと、なぜget_my_hand()をmy_handに置き換える必要があるのかが理解出来ていないのです。

だから「必要性」、なんか無いんだ(笑)。

貴方が疑問に持った通り、実の事を言えば

「何でもかんでも変数に代入すりゃあエエってもんじゃない」

貴方の勘は正しい、んだよ。

何らかの計算結果を変数に代入する場合、「計算結果を使いまわししたい」と言う前提がある。
ある全く同じ計算を複数回行うのは無駄、って事だ。そのケースの時、「ある計算結果」を変数に代入しとけば、「わざわざ再度計算せんでエエ」ってメリットがあるわけだな。必然的に作ったプログラムのスピードは上昇する。
「同じ計算を再度行う」より「結果を複数回参照する」方が速度的に有利だから、だ。
まずこれが大前提、だ。

ところが、必然性を無視した話をすると、人によっては

「関数を直接使うより特定の変数名を用いて多用する方がプログラムが読みやすくなる」

って人たちがいる。ここで出てくるのが「可読性」って概念だ。
「ソースコードが読みやすいか読みやすくないか」って話だな。
単純に言うと、例えば、直接関数を使ってget_my_hand()とカッコを引き連れて書くより、my_handとした方が見やすいだろ、ってな話だ。
これはこれである意味正しい。
ただし、それで「全員が全員納得するか」っつーとこりゃまた別の話なんだよ。
現に貴方が引っかかってる。
そして「変数に代入」して「変数に代入」して「変数に代入」して・・・ってプログラムになると特定の層にとっては読みやすくはなっても、それ以外の人には今度はかったるくって読みづらくなる。
そういう状態を「冗長だ」とか表現するんだけど。

要は実は次のような対立的な「表現方法」に於ける概念があるんだ。

可読性 <-> 冗長

つまり、あまりにも不必要に「変数に関数の計算結果を代入ばっかしてると」冗長になり、かと言ってあまりに関数そのものを直接使うと「可読性が落ちる」、と。
分かる?「プログラミングでどっちが理屈として正しいのか」って話じゃなくって、単に「どう書けば(自分にとって)分かりやすいのか」と。
言っちゃえば個人の趣味の問題で、どの辺にバランスを置くのか、ってのは「貴方の判断次第」なんだよ。
今回の話で言うと、どこだっけ?gacco?なのか?が提示したコードが、極論、「貴方の趣味に合わなかった」だろう話なだけ、なんだ。

僕個人の趣味で言うと、提示されたコードは「冗長」だ。「初心者相手だからこうしました」ってのは関係ないくらい「冗長だ」と思う。
まぁだから、趣味の問題で言うと、多分貴方の感覚は僕の感覚と近いんじゃないかな、って思う。貴方が言う「アレ?」って思うだろう「引っかかる感覚」は僕も感じる。「そこで代入する必然性があるの?」って僕も思う。
僕はどっちかっっつーと「代入しないで済むなら代入しない」タイプなんで、「なんでもかんでも代入せな」って流儀には反対のタイプなんだ。
ただ、「なんでもかんでも変数に代入した方が分かりやすい」って人も多いんで、この辺の溝は埋まらないんだよ(笑)。「あなたは乳派ですかそれとも尻派ですか?」ってくらいの違いがある。俺は尻派だけどな(謎

例えばお題のプログラム程度だとこう書く事も出来る。

https://www.ideone.com/DkIYwF

勘違いして欲しくないのは「こう書くべきだ」って言ってるわけじゃない。あくまで例示だ。
ただ、単純な比較だけど、お題のプログラムがシンプルな機能の割には27行要してるトコ、こっちだと8行程度で済んでる。1/3くらいの行数だ。
そして、短くはなってるけど「読みやすい」とはまた別でしょ?多分こういう実例見た方が早いと思うんだけど。「圧縮されたコード」は冗長ではないけど、一般的には可読性がイマイチになる、って例だ。
要は「同じ事やるにせよ複数の解がある」って実例だよな。これは「プログラミング」の問題じゃなくって「書法の問題」と言える。
この「なるたけ短いコードでお題を消化する」ってのと「ある程度の冗長さを含めながら可読性を上げる」のどの辺でバランスを取るのか、ってのはあくまで「個人の趣味」だ。貴方が決めてイイ。

どの辺が「自分にとって最適なのか」、これからゆっくり学んで行ってください。
繰り返すけど、それは別に「プログラミングとはこうしなければいけない」とは関係ないので。
    • good
    • 1
この回答へのお礼

ありがとう

ご回答いただいた皆様、ありがとうございました。
 本当であれば全員にベストアンサーをつけたいところなのですが、今回は最も文字を尽くしてご回答いただいたcametan_42様を選ばせていただきました。
 また質問をする際には是非よろしくお願いいたします。

お礼日時:2023/04/22 17:15

しかし、このプログラム


勝ち負け判定が技巧的過ぎるな。
私ならレビューでハネると思う。
素直に書いて欲しい。
とすれば、変数への代入は必須かな。
    • good
    • 1

>get_my_hand()


>get_you_hand()
>hand_diff = get_my_hand() - get_you_hand()
>
>と記載してはダメな理由を教えていただきたいです。

これだと自分の手を2回入力する羽目になるから
駄目です。意図した動作ではないですよね。

入手した手を捨てるのは意味が無いです。

hand_diff = get_my_hand() - get_you_hand()

の―行なら問題は無い。

元のコードで一度変数に入力したのは
取得した内容、処理手順
を明確にコード表したかったのでしょう。

必須では無いです。
    • good
    • 1
この回答へのお礼

ありがとう

ご回答ありがとうございます。
すっきりしました。

お礼日時:2023/04/22 17:16

my_hand = get_my_hand()   ・・・①


you_hand = get_you_hand()   ・・・②
hand_diff = get_my_hand() - get_you_hand()
ではなく
hand_diff = get_my_hand() - get_you_hand()
です。(①、②をとる)
①があると、get_my_handが2回呼び出されます。
②があると、get_you_handが2回呼び出されます。
    • good
    • 1
この回答へのお礼

ありがとう

ご回答ありがとうございました。
勉強になります。

お礼日時:2023/04/22 17:17

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