YKTのどっちがいいかな?

実世界連動地域貢献型すごろくゲームのアプリ開発状況を書いていきます。

キャパカリオンでもわかるプログラミング講座(皮)

今週末は両親が来ることになっておりまして(皆さんが読んでいるころには来てます)ブログを書く余裕がなく、泣く泣く平日に書いているlabheaです。あ、いや、ここ最近は週末にがっつり開発したかったので毎度のことなんですけどね。

MOMOもひと段落したことで、わざわざデスクトップPCに向かう必要もなくなり、今回は試験的にiPadでブログを書いています。

とりあえずmarkdownで書きたいので、Mwebなるアプリを入れてみました。しばらくはいろんなアプリを試してみたいと思います。(どうせそのうちPCにも戻っているんだろうな。。。)

さてさて、プログラミング講座の続きをやっていきたいと思いますが、いかんせんモチベーションが上がらない。理由はもちろん誰かさんがこれからやろうとしてた答えをスクショでブログにあげやがったからです。くー。

今回から連載のタイトルをシンカリオンからキャパカリオンに変更しました。これは「capaさんでもわかるならみんなもわかるやろ」と揶揄っているわけでは決してありません

シンカリオンが好きな我が子に最適なプログラミング教材はないものか…と探している親御さんにご迷惑をお掛けしないためです。

f:id:labhea:20190305232731p:plain

(あれ、パソコンだったら“シンカリオン プログラミング”だけで出てきたのに企画倒れじゃねーか。。。)

まあいいや。キャパカリオンなら世の中広しと言えどググるのはなおやくらいのはず。。。(ここまで前置き)

収支計算プログラム

時間が限られている中で他のネタを今から考えるのもしんどいので、予定通り誰かさんの収支を計算するプログラムを作りましょう。

え?…パワフルIPATがあれば勝手に計算してくれるからいらない??
うっせぇ黙ってろ。

せっかくなので恨みつらみをがっつり詰め込んだ辛口仕様にしましょうw

仕様

まずは、どういうプログラムにするのか決めましょう。

まず、これまでのレース結果を こんな感じでまとめていたとしましょう。

f:id:labhea:20190305232759p:plain

iPadで作業することを決めた人の意地)

さて、これをCSV形式で保存しましょう。

f:id:labhea:20190305232843p:plain

...ん?CSV出力が...ない??





  サヨウナラ、アイパッド。タダイマ、オンボロパソコン。

私が轆轤(ろくろ)を回しながら「ブログ?iPadだけですね。」と取材に応じるのはもう少し先になりそうです。

f:id:labhea:20190306002243p:plain

PCに帰ってきた記念。アクセス数とか反映してんのかな?

さてCSVテキストエディタ(メモ帳とか)で開くと以下のようになっています。

日付,レース,掛け金,払戻し
1月5日,中山金杯,1000,0
1月5日,京都金杯,1200,0
1月6日,シンザン記念,1000,0
1月12日, フェアリーS,1000,0
1月13日,日経新春杯,1200,0
(略)

CommaでSeparateされたValue達が並んでいますね。

今回は、

  • CSVファイルを読み込む
  • 月ごととトータルの収支を計算する
  • 計算した値を画面に出力する

そんなプログラムを作っていきたいと思います。

ファイルを読み込む

まずはここをクリアしないと何も始まりませんね。

ただ、やること自体は何も難しくはありません。

  • ファイルを開く
  • 内容を適切に変数に格納する
  • ファイルを閉じる

以上です。

ファイルを開く

f = open("ファイル", "r")

とすると、”ファイル”という名前のファイルを、読み込みモード(readの"r")で開いて、fという名前の変数に格納します。

ここでfに入るのはファイルの中身ではなく、ファイルをハンドリングするための機能だということに注意してください。

さて、いつ説明しようかずっと悩んでいたのですが、いままでもちょいちょい出てきている、

  • print("YKT")
  • range(1, 4)
  • open("file", "r")

のように()が付いているものは、関数と呼ばれるものです。特にこれらはpythonという言語の基盤レベルで定義されている組み込み関数と呼ばれるものです。

数学の関数よりは、魔法を想像してもらった方がいいと思います。

これは自分で関数(いわばオリジナルスペル)を作ってみるとしっくりくるかと思いますので、今はprint()は括弧の中身(引数と言います)を画面に出力する魔法、range(x,y)は第一引数xから第二引数yまでの整数列を生み出す魔法のように認識していてください。

open()はどんな魔法?

先ほどfの中に入るのはファイルの中身ではなく、機能だとお話ししました。

さっきの魔法のノリで説明するとopen()はファイルを操作する魔法群、すなわち魔導書を生み出す魔法といえます。え、なんかとっても中2。

魔導書の中の魔法を使うには以下のようにピリオド(.)でつなぎます。

content = f.read() #魔導書fの中からread()魔法を呼び出す

魔導書にはどんな魔法があるの?

読み込みでよく使う(よもや全部?)魔法は以下の通りです。

content = f.read()    #ファイルの中身をまるごとぜーんぶ一つの文字列として読み込んでcontent変数に格納
lines = f.readlines() #ファイルの中身を全部読み込むけど文字列は行ごとに区切ってリストにするよ
line = f.readline()   #一行だけ読み込むよ

あと忘れてはいけないのが

f.close()

自己消滅魔法です。あらやだ、すごーく中2。

ファイルは開きっぱなしにしておくと、いろいろめんどくさいことになります。具体的な説明はしませんが、まあ、電話とかSkypeとか切ったと思ったのにつなぎっぱなしで生活してたら軽く100回くらい死にたくなるでしょ?それと同じです。

ファイルは用事が済んだら閉じる。これが鉄則です。

そうはいっても忘れます

ファイルの閉じ忘れとかほんとよくあります。私も昔はしょっちゅうやらかしてました。

そんな人に朗報です。pythonでは次のような書き方もできます。というか皆さんはこっちで覚えてください

with open("file","r") as f:
    content = f.read()

付帯状況のwith見たいな感じです。open魔法で魔導書fを生み出した状況で、インデント内の処理を行うという書き方です。

こうするとfはインデント内のみに有効な変数となり、インデントを抜けたタイミングで自動的に消失、すなわちクローズされるという仕組みです。

説明が長くなってしまいましたが、例によっていじってみましょう。

いよいよcsvの読み込み

さて、本題に戻り、csvファイルの読み込み方を考えましょう。

まず1行目がタイトル行になっていますので、ここは読み飛ばします

そして2行目からが取り扱いたいデータとなっていますので、一行ずつ読んで処理するということをするとよさそうです。

とりあえずは一行ずつ読んで変数に格納し、それをそのまま出力するというコードを書いてみましょう。

プログラミングっぽくなってきましたね。

内容を適切に変数に格納

文字列の分割

さて、ここまでで無事データを一行ずつ文字列として読み込めるようになりました。

次にやりたいことは読み込んだ1行の文字列から「日付、レース名、掛け金、払戻し」それぞれを抽出することです。

ここで便利なのがsplit()魔法です。これは文字列自身が所持している魔法で、引数の文字を区切りとしてリストにしてくれるというものです。

魔導書のときと同様所持している魔法はピリオドで呼び出せます。

ま、これはやってみたほうが早いでしょう。

リストの受け取り方

さて、今回の場合では結局、

data = line.split(',') #コンマ区切りで文字列を分割

とすれば、dataというリストが出来上がります。そして、

data[0] #日付
data[1] #レース
data[2] #掛け金
data[3] #払い戻し

といった具合に情報が入っているわけです。でもこれだと何番に何が入っているかすぐにわかんなくなりそうです。

ですので、

date = data[0] #日付
race = data[1] #レース
bet = data[2] #掛け金
return_ = data[3] #払い戻し returnは予約語((序)参照)なのでアンダーバーを入れてます

と変数を置きなおしたほうが後々のためによさそうです。もちろんこれでも構いませんが、もっとスマートに

date, race, bet, return_ = line.split(',') #リストの各要素をそれぞれの変数に格納

のように書くと直接リストの中身を各変数にぶち込めちゃいますpythonってホント便利だなあ。

数値に変換

split()魔法のおかげで各要素をバラバラに格納できましたが、この状態だと各変数はすべて文字列の状態です。特にbetとreturn_はこれから数値計算に使いますので、文字列から整数に変換する必要があります。

大丈夫です。int()魔法を使えば一発です。

中間ゴール

ここまでくれば、前回までの知識と合わせて、全部の収支を計算できますよ。早速やってみましょう。

Time up

うぐ。もう少し先までコードは用意していたのですが、残念ながらタイムアップとなってしまいました。

月別の収支を計算するのは次週に回します。

収支計算の話はあと2回続く予定ですので、しっかりと抑えておいてください。