こんにちは。
今回は Python のうち「オブジェクト指向型プログラミング」に関する練習問題を行いたいと思います。
Pythonのオブジェクト指向については、以下の記事で学習する事が出来ます。
Pythonにおけるオブジェクト指向について解説【入門編その①】
続きを見る
Pythonにおけるオブジェクト指向について解説【入門編その②】
続きを見る
更に、オブジェクト指向の練習問題として以下の問題もあるので、tryしてみて下さい。
【Python】オブジェクト指向の練習問題【診療支援アプリ作成】
続きを見る
では早速みていきましょう。
仕様|チームの勝ち負け数を表示する
目標は以下のサッカーW杯の勝敗表を Python でプログラミングを行い表示させることです。
サッカーW杯 国別勝星ランキング
順位 | 国名 | 勝 | 負 | 引き分け | 勝率 |
1 | ブラジル | 73 | 18 | 18 | ? |
2 | イタリア | 45 | 21 | 21 | ? |
3 | アルゼンチン | 43 | 15 | 15 | ? |
4 | 西ドイツ | 36 | 14 | 14 | ? |
5 | フランス | 34 | 13 | 13 | ? |
6 | ドイツ | 31 | 6 | 6 | ? |
7 | スペイン | 30 | 15 | 15 | ? |
【引用】サッカーワールドカップ(ロシア)国別勝敗ランキング 2018年度版
国名の英語名は各々以下になります。
- ブラジル:Brazil
- イタリア:Italy
- アルゼンチン:Argentina
- 西ドイツ:West Germany
- フランス:France
- ドイツ:Germany
- スペイン:Spain
以下が手順になります。
手順
- まず、勝負を管理するためのクラスを作成してください。
- その上で、クラスからインスタンスを6チーム分作成してください。
- インスタンスを作成後に、各チームの勝負数を表示するプログラムを作成してください。
以下が仕様になります。
仕様
- football_team.py というファイルを作成し、そこに
Football_Team
というクラスを作ってください。 - 以下のメンバ変数=プロパティを
Football_Team
に持たせてください。
name
(英語での国名)win
(勝数)lose
(負数)draw
(引き分け数)
- 勝率は「勝ち数/(勝ち数+負け数)」
- 勝率は
calc_win_rate()
メソッドをFootball_Team
に作ってください。 show_team_result()
というメソッドをFootball_Team
に作ってください。- use_football_team.py という名前のファイルを作成し、football_team.py からクラス
Football_Team
をインポートしてください。 - use_football_team.py の中で
Football_Team
のインスタンスを6個作り、各々のチームの名、勝数、負数、引き分け数、勝率を記載します。 - 表の見出しを表示するコードを記載してください。
- 国別の各インスタンスの
show_team_result()
メソッドを呼び出し、勝敗情報を表示してください。
では早速コーディングしていきましょう。
ご自身でtryしてみてコーディングできれば、以下の解説で違いを確認してください。
あくまでもコードの一例ですので、色々な例があります。
実装の手順|チームの勝ち負け数を表示する
入力するファイルを作成する
まずは football_team.py
と言うファイルを作成してみましょう。
1 2 3 4 5 6 | class Football_Team: def __init__(self, name, win, lose, draw): self.name = name self.win = win self.lose = lose self.draw = draw |
まずは Footbal_Team
というクラスを作り、def __init__
でコンストラクタを定義します。
更に、self の引数を入れることで、初期設定を行います。
次に、勝率を計算するコードを書きましょう。
1 2 | def calc_win_rate(self): return self.win / (self.win + self.lose) |
重要なことは、def calc_win_rate(self):
はメソッドですので、値は return
で返すか、print
で表示することになります。
今回はreturnで返しました。
ところで、return と print の違いがあやふやな方。以下をご参照ください。
print()
・・・表示する(only)return
・・・戻り値を返す
次に、勝敗結果を表すコードを書いてみましょう。
print
の()
引数にはフォーマット済みリテラルを使用しています。
prin()
の使い方については以下で詳しく解説していますので、参照して下さい。
Pythonのprintの書き方について【基本から応用まで】
続きを見る
フォーマット済みリテラルを忘れてしまった方は以下の記事を参照してください。
【Python】formatメソッドとフォーマット済み文字列の使い方の違い【基本から解説】
続きを見る
In[]
1 2 | def show_team_result(self): print(f"{self.name:12s} {self.win:3d}{self.lose:3d} {self.draw:2d} {self.calc_win_rate():.3f}") |
ここで表示されている f"{self.name:12s}
の s
, {self.win:3d}
, {self.lose:3d}
のd
など、s
や d
が意味していることは何でしょうか。
- s は文字
- d は数字[/box]を意味しています。
さらに、最後の :.3f
について解説します。
Pythonで小数点以下第3位まで表示させて、かつそれ以下は切り捨てで表示させたい場合には、import decimal
を使用してください。使い方は以下のサイトを参照ください。
>> 【Qiita】Pythonで少数点以下第3位まで表示して、それ以下は切り捨てて表示させたい。
更に、少数点以下の桁数を指定する時の注意点です。
小数点以下の桁数を指定する時は、置換フィールド {} の中に、コロンとピリオドを続けて {:.桁f} と打ちます。例えば、小数点以下2位で表示したければ、{:.2f} 、3位で表示したければ、 {:.3f} と打ちます。>>HEADBOOST Pythonの桁数や丸めなどの操作のまとめ
for文をイマイチよく分かっていない、または忘れた方は以下の記事でまとめているので、参考にして下さい。
【Python】for文の使い方について
続きを見る
出力するファイルを作成する。
use_football_team.py
として出力するファイルを作成しましょう。
1 | from football_team import Football_Team |
さらに以下を加えます。
1 2 3 4 5 6 7 | brazil = Football_Team('Brazil', 73, 18, 18) italy = Football_Team('Italy', 45, 21, 21) argentina = Football_Team('Argentina', 43, 15, 15) westgermany = Football_Team('West_Germany', 36, 14, 14) france = Football_Team('France', 34, 13, 13) germany = Football_Team('Germany', 31, 6, 6) spanish = Football_Team('Spanish', 30, 15, 15) |
次にチームの成績を入力していきます。
1 2 3 4 | teams = [brazil, italy, argentina, westgermany, france, germany, spanish] for team in teams: team.show_team_result() print(team.show_team_result()) |
最後に teams
から team
を一つずつ取り出して勝敗の結果を取り出すコードを書きます。
ここで一点間違いがあります。
print(team.show_team_result())
というコードです。
これはクラス内に直接呼出し側のスクリプトを書いて、クラスだけで実行という事をしており、print(team.show_team_result())
は削除する必要があります。
Pythonのfor文は原則「データの集まり」から、「データを一つずつ取り出す」という作業を行うための文法でした。
1 2 3 4 5 6 7 8 9 | Brazil 73 18 18 0.802 Italy 45 21 21 0.682 Argentina 43 15 15 0.741 West_Germany 36 14 14 0.720 France 34 13 13 0.723 Germany 31 6 6 0.838 Spanish 30 15 15 0.667 Spanish 30 15 15 0.667 None |
綺麗に出力できました。
左端の文字列も West_Germany
の12文字に合わせて 12d とする事で揃える事ができました。
まとめ|チームの勝ち負け数を表示する
如何でしたでしょうか。
最終的のコードを記載しておきます。
football_team.py
1 2 3 4 5 6 7 8 9 10 11 12 | class Football_Team: def __init__(self, name, win, lose, draw): self.name = name self.win = win self.lose = lose self.draw = draw def calc_win_rate(self): return self.win / (self.win + self.lose) def show_team_result(self): print(f"{self.name:12s} {self.win:3d}{self.lose:3d} {self.draw:2d} {self.calc_win_rate():.3f}") |
use_football_team.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from football_team import Football_Team brazil = Football_Team('Brazil', 73, 18, 18) italy = Football_Team('Italy', 45, 21, 21) argentina = Football_Team('Argentina', 43, 15, 15) westgermany = Football_Team('West_Germany', 36, 14, 14) france = Football_Team('France', 34, 13, 13) germany = Football_Team('Germany', 31, 6, 6) spanish = Football_Team('Spanish', 30, 15, 15) teams = [brazil, italy, argentina, westgermany, france, germany, spanish] for team in teams: team.show_team_result() |
use_football_team.py の出力結果は以下になります。
1 2 3 4 5 6 7 8 9 | Carp 88 51 4 0.633 Tigers 78 61 4 0.561 Baystars 73 65 5 0.529 Giants 72 68 3 0.514 Dragons 59 79 5 0.428 Swallows 45 96 2 0.319 Process exited with code: 0 |
以上答え合わせとして利用してください。
今回はオブジェクト指向型プログラミングの考え方の復習となる練習問題を行いました。
コンストラクタの使用方法やインスタンスメソッドの仕様方法など、この問題を通してよく復習する様にしてください。