キャパカリオンでもわかるプログラミング講座(ク)
付着しているであろう奴の唾液が検出されるわ
この前の金ローはволшебник конце века でしたね。いやーいつみても面白いですね。
それはそうと某吹替えのせいかガッチャマンがトレンド入りしたそうですね。
かく言う私も見ている間あの動画がちらついて仕方がありませんでした。
できるならばもう一度見たいものです。
公式動画のほうはHuluでまた配信が始まるのでしばらくコナンウィークですかね(今もレクイエム見ながら書いてます)。
本題
前回は特別編としてお送りしましたが、私の見立てとは裏腹に難しかったようで・・・すんません。
今回はまた収支計算に戻ります。
この前までで、トータルの収支は計算できるようになりました。
今回は月ごとの収支を計算しましょう。
条件分岐
さて今回やりたいのは、月ごとに別途の処理を行うことです。
月ごとに別の処理を行う・・・別の処理・・・もし〇月ならこの処理・・・ってことでif文を使えばできそうですね。
いま変数dateに〇月〇日のフォーマットでレース開催日時が入っています。
つまりこのdateに1月という文字があれば1月用の変数に収支を足していくということをすればよさそうです。
文字列bに特定の単語aが含まれているかどうかは、
a in b
で判定できます。入っていればTrue,そうでなければFalseが返ってきます。
ですので
if '1月' in date: (1月用の処理)
とすればよさそうですね。
これをバカ正直にやればこんな感じです。
これでもいいですが、なんかダサいですよね。
繰り返し
さて、先ほどのコードをよく見てみますと、月こそ違えどやっている処理は同じですね。
となれば格納する変数をリストにすればfor文で何とかできそうですね。
ここで注意しなければならないのはリストは0から始まるということです。
1~12月のデータを格納にあたって、今回は13個(0~12まで)のリストを作り、0番目を使わないことにしましょう。
動作をチェック
ここで大事なのはちゃんと期待通り動くかチェックすることです。
現状ではまともに動いていますが、今後データを追加したときにも正しく動作するか確認する必要があります。
それでは、ひとつ上に戻ってデータタブに架空のデータを追加してみてください。
特にすべての月を網羅してみるのが大切です。
・・・皆さんできましたか?
・・・ちゃんとやるんですよ?
・・・ほんとにやりましたか?
ということでやってもらったらわかる通りうまく動いていますね。
・・・なんじゃい、ちゃんと動くんかいっと突っ込んだあなた。さてはちゃんとやってないですね。
結論から言うと今のままだと正しく動作しません。どこに変な箇所があるか考えてみましょう。
わかりましたか?
答えだけ見ても成長しませんよ?
そろそろうざがられそうなので答えいっちゃいますよ?
TAKA 3-8
いいですか?
よくある落とし穴
さて優良な読者の皆様はお分かりかと思いますが、このコードのままだと1月と2月の収支が正しく計算できません。
それはなぜかといいますと、今date変数に1月もしくは2月という文字が含まれているかという判定をしているので、11月および12月のデータも足されてしまうからです。
この問題を解決するためには、date変数に1月という文字が含まれているではなく、dateの中身が1月という文字で始まるという評価にするのがよさそうでしょう。
こういう条件付き文字列検索には、正規表現という一般規格があって、これを覚えておくといろいろなところで便利なのですが、、、
これだけで一記事書けちゃうので今回はstartswith関数を使いましょう。
startswith関数は文字列型が所持している関数で、
a.startswith(b)
とすると、文字列aがbから始まる場合Trueを返します。
ですので、
if date.startswith('1月'): (1月の処理)
とすれば、1月と11月の区別がつきそうですね。
発展(?)
ようやく正しく動作するプログラムを作ることができました。
もちろんこれでもいいのですが、今度はコード自体の良し悪しを考えてみましょう。
ひとつ上のコードをじーーーーっと眺めてみてください。
どうですか?
そこはかとなく昔のめんどくさいOL臭を感じませんか?
たとえるならこうです。
A男「B子さんっていくつなの?」 B子「・・・あなたに関係ありますか?セクハラで訴えますよ?」
おっと失礼。これはMOL(Modern Office Lady)でした。
A男「B子さんっていくつなの?」 B子「え~いくつに見えます?当ててみてください~」 A男「21?」 B子「違いま~す」 A男「26?」 B子「惜しいで~す」 A男「24?」 B子「やっぱ内緒で~す」
じゃかしいわ、ボケ! ってなるやつです。
さて、これを踏まえてコードを見てみると、似たようなことになっていることに気づいてもらえるかと思います。
つまり、今のコードは毎行読み込まれてくる変数dateに対し、A男が「君は1月生まれ?それとも2月?いや3月かな?と見せかけて4月が似合いそうだ」と総当たりで確認していることになります。A男、いたたまれない子。。。
もしdateのほうから「私、7月生まれなんですけどどうしたらいいですか?」と自己申告してくれれば、もっと効率が良くなるはずです。
つまりdateから何月かを抽出し、その月に対応するデータについて計算すればいいのです。
抽出と聞くと難しく聞こえますが、実は皆さんはもうその手立てを知っています。
考えてみましょう。
せ
い
かいは
’月’を区切り文字としてsplitしてしまえばよさそうですね。
おわりに
さて、月別収支計算をしてみましたが、いかがだったでしょうか。
そして興味深いことに2月の収支が +100円 になっていますね。
一方でinovativeさんのブログで報告している収支は -1400円 です。
おやおや、おかしいですね?
ブログを隅々まで見てみると(隅々まで見たnonstyleさんに教えてもらった)、2/10の記事にこんなことが書いてありますね。
さらっと重賞以外に手を出したことを白状していますね。
さて、掛け金についての言及はなかったのですが、今回の計算によって 1500円 掛けていたことがわかりました。
あらあら、まあまあ。今年のどの重賞の掛け金よりも高いじゃないですか。
よほど自信があったのでしょうか。
お可愛いこと。