Misaku
@Misaku (Misaku suzuki)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

python オブジェクト指向 練習

昨日も投稿させていただいたのですが、相変わらず同じ練習問題から抜けきれません。

現在野球チームの点数と勝率を表示させる表を作成しています。
昨日の質問に回答していただいた方のコードを参考にして、チーム名や点数の表示はできたのですが、

勝率を表示させようとすると、0 になるかもしくは空白になってしまいます。

renshu
class Baseball_Team:

    def __init__(self,name="team",\
                 win="win",lose="lose",\
                 draw="draw"):
        self.name = name
        self.win = win
        self.lose = lose
        self.draw = draw
        self.win_rate=0
        
    def clac_win_rate(self):
        self.win_rate = str(self.win / (self.win + self.lose))
        
    def show_team_result(self):
        show_team_result=(f"{self.name:8}{self.win:4}{self.lose:5}{self.draw:4}{str(round(self.win_rate,3)):6}")
        print(show_team_result)

print("team     win lose draw rate")

Giants = Baseball_Team("Giants",77,64,2)
Giants.show_team_result()

BayStars = Baseball_Team("BayStars", 71, 69, 3)
BayStars.show_team_result()

Tigers = Baseball_Team("Tigers", 69, 68, 6)
Tigers.show_team_result()

Carp = Baseball_Team("Carp", 70, 70, 3)
Carp.show_team_result()

Dragons = Baseball_Team("Dragons", 68, 73, 2)
Dragons.show_team_result()

Swallows = Baseball_Team("Swallows", 59, 82, 2)
Swallows.show_team_result()

   
出力結果
team     win lose draw rate
Giants    77   64   20     
BayStars  71   69   30     
Tigers    69   68   60     
Carp      70   70   30     
Dragons   68   73   20     
Swallows  59   82   20  

このように、rateの部分が空白になってしまいます。

self.win_rate = str(self.win / (self.win + self.lose))

この結果を表示させたいだけなのですが、
Giants.show_team_result()の下にclac_win_rateを表示さても空白なのです、
エラーが出るならまだ調べたりできるのですが、なぜこのような結果になるのか教えていただきたいです。
よろしくお願いします。

clac_win_rateを表示?させたいコードを追加
class Baseball_Team:

    def __init__(self,name="team",\
                 win="win",lose="lose",\
                 draw="draw"):
        self.name = name
        self.win = win
        self.lose = lose
        self.draw = draw
        self.win_rate=0
        
    def clac_win_rate(self):
        self.win_rate = str(self.win / (self.win + self.lose))
        
    def show_team_result(self):
        show_team_result=(f"{self.name:8}{self.win:4}{self.lose:5}{self.draw:4}{str(round(self.win_rate,3)):6}")
        print(show_team_result)
   
print("team     win lose draw rate")

Giants = Baseball_Team("Giants",77,64,2)
Giants.show_team_result()
Giants.clac_win_rate()#ここが追加したコードです。

BayStars = Baseball_Team("BayStars", 71, 69, 3)
BayStars.show_team_result()

Tigers = Baseball_Team("Tigers", 69, 68, 6)
Tigers.show_team_result()

Carp = Baseball_Team("Carp", 70, 70, 3)
Carp.show_team_result()

Dragons = Baseball_Team("Dragons", 68, 73, 2)
Dragons.show_team_result()

Swallows = Baseball_Team("Swallows", 59, 82, 2)
Swallows.show_team_result()
clac_win_rateを追加したコードの出力結果
team     win lose draw rate
Giants    77   64   20     
BayStars  71   69   30     
Tigers    69   68   60     
Carp      70   70   30     
Dragons   68   73   20     
Swallows  59   82   20     

0

2Answer

rateの部分が空白

よく見てください... drawは1桁のはずなのに数十の2桁の値になってませんか...?
前回@eudika さんの回答を思い出してください.

数値型はデフォルトで右寄せ、文字列は左寄せです。

win_rateを小数3桁で丸めた後,str()に変換したため,数値なのに左寄せで扱うことになり,右寄せの数値であるdrawとくっついているのです.

したがって,rateの部分は空白ではありません.0で初期化されたので,0がちゃんと表示されています.
また,show_team_result()の後にcalc_win_rate()をしてもすでに表示したwin_rateは上書きされません.先にcalc_win_rate()をするべきです.

class Baseball_Team:

    def __init__(self,name="team",\
                 win="win",lose="lose",\
                 draw="draw"):
        self.name = name
        self.win = win
        self.lose = lose
        self.draw = draw
        self.win_rate = -1
        
    def clac_win_rate(self):
        self.win_rate = self.win / (self.win + self.lose)
        
    def show_team_result(self):
        show_team_result = (f"{self.name:8}{self.win:4}{self.lose:5}{self.draw:4}")
        if self.win_rate != -1:
            show_team_result += f"{self.win_rate:7.3f}"
        else:
            show_team_result += "  None"
        print(show_team_result)

print("team     win lose draw rate")

Giants = Baseball_Team("Giants",77,64,2)
Giants.clac_win_rate()
Giants.show_team_result()

BayStars = Baseball_Team("BayStars", 71, 69, 3)
BayStars.show_team_result()

Tigers = Baseball_Team("Tigers", 69, 68, 6)
Tigers.show_team_result()

Carp = Baseball_Team("Carp", 70, 70, 3)
Carp.show_team_result()

Dragons = Baseball_Team("Dragons", 68, 73, 2)
Dragons.show_team_result()

Swallows = Baseball_Team("Swallows", 59, 82, 2)
Swallows.show_team_result()

実行結果は

team     win lose draw rate
Giants    77   64   2  0.546
BayStars  71   69   3  None
Tigers    69   68   6  None
Carp      70   70   3  None
Dragons   68   73   2  None
Swallows  59   82   2  None

になります.

もっと言えば,先の質問に回答したことの繰り返しになりますが,引数のデフォルト値が文字列で設定されている

    def __init__(self,name="team",\
                 win="win",lose="lose",\
                 draw="draw"):

のに,結局渡している値は整数値で整合性が取れていません.現状,Baseball_Teamに必要な引数の値は勝率計算のためのwinloseだけです.

def __init__(self, name, win, lose, draw = 0):

でやるべきだと考えます.

3Like

Comments

  1. @Misaku

    Questioner

    おお、ありがとうございます!1日悩んでたが、たったこれだけのことだったのですね!
    rateの表示については全く気がつきませんでした、、

    ありがとうございます!今日はこれでスッキリして寝れます。
    def __init__(self,name="team",\
                 win="win",lose="lose",\
                 draw="draw"):

win, lose, draw は数値を扱う変数なのですから、デフォルト値も数値にしましょう。

    def clac_win_rate(self):
        self.win_rate = str(self.win / (self.win + self.lose))

計算の英語は calculate なので、略するなら calc ですよ。
strを使うと文字列に変換されてしまい、round処理はできませんよ。

こうすれば表示されるようになります。

class BaseballTeam:

    def __init__(self, name, win, lose, draw):
        self.name = name
        self.win = win
        self.lose = lose
        self.draw = draw
        self.win_rate = self.calc_win_rate()

    def calc_win_rate(self):
        return self.win / (self.win + self.lose)

    def show_team_result(self):
        team_result = f"{self.name:8}{self.win:4}{self.lose:5}{self.draw:5}{self.win_rate:6.3f}"
        print(team_result)


print("team     win lose draw rate")

giants = BaseballTeam("Giants", 77, 64, 2)
giants.show_team_result()

baystars = BaseballTeam("BayStars", 71, 69, 3)
baystars.show_team_result()

tigers = BaseballTeam("Tigers", 69, 68, 6)
tigers.show_team_result()

carp = BaseballTeam("Carp", 70, 70, 3)
carp.show_team_result()

dragons = BaseballTeam("Dragons", 68, 73, 2)
dragons.show_team_result()

swallows = BaseballTeam("Swallows", 59, 82, 2)
swallows.show_team_result()

Pythonには「PEP8: Pythonコードのスタイルガイド」があって、命名規則も書いてありますので、従うようにするといいですよ。

  • クラス名: キャピタライズした英単語を接続。アンダースコア文字は使わない
  • 変数名、関数名、メソッド名: 英小文字。アンダースコア文字で単語接続してもよい
  • 定数: 英大文字。アンダースコア文字で単語接続してもよい
2Like

Comments

  1. @Misaku

    Questioner

    ありがとうございます! おかげさまで無事解決しました!
    またよろしくお願いします!!

Your answer might help someone💌