Python

【繰り返し】でトマトの収穫時期を予想する

Python

[PR]当サイトはアフィリエイト広告を利用しています。

今回は繰り返し処理の練習をします。

繰り返し処理とはある決まった処理を決まった回数繰り返す処理のことです。最初に簡単なプログラムで繰り返し処理を説明して、それからトマトの収穫時期を予想するプログラムを作成します。

トマトはその日の平均気温の積算が1100℃程度で収穫できるので、毎日の平均気温のデータを合計すれば収穫適期かどうかわかります。こういう処理は繰り返し処理と相性がいいのです。

それでは始めていきましょう。

繰り返し処理はプログラミングの基本だからこの機会に覚えよう!

簡単な繰り返し処理

以下のプログラムは5つの数値を合計するプログラムです。

num = [1,4,6,3,2,5]
sum = 0
for a in num:
   sum += a
print(sum)

出力は21です。

今回は初めてリストというものが出現しました。[1,4,6,3,2,5]の部分です。これはリストと呼ばれる表記で、他のプログラミング言語では「配列」とも言われています。

5つの数値ならnum1=1, num2=4…とかでいいんじゃないの?

それでもいいんだけど、そうすると繰り返し処理と相性が悪いんだ。リストの形で数値をまとめると、一つ一つの要素にIDが割り振られるんだよね。

上の1はnum[0]、4はnum[1]みたいな感じだね。

それを「for a in num:」と書くと、「numというリストから一つずつ要素を取り出して、それをaという変数に代入します」という処理が簡単に書けるんだよ。

for文ってなんなのさ?

これが今回の記事の要なんだ。繰り返し処理を指示する命令文だよ。

forのあとに変数名を書いて、「in 使いたいリスト名」を書くことで、使いたいリストから要素を順番に一つずつ取り出して変数に代入する。

そのあとにfor文内の処理を一回実行する。実行したらfor文の最初に戻って、リストから次の要素を一つ取り出して変数に代入する。

上の例ではfor文が始まったら、まず1が取り出されてaに代入され、それをsumという変数に足す。

sum += aって何なのさ?

これも新しい書き方なんだけど、こう書いたら「sum = sum + a」の意味なんだ。

「=」の右は現在のsumの値。それにaを足して、結果をsumに代入するという意味だよ。sumの初期値は0だったから、aの中身である1が足されてsumは1になるよ。コードを短く書くための短縮技みたいな感じだね。

これでsumは1になりました。for文の最初に戻ります。するとaにはリストの次の要素の4が代入されます。そして1だったsumに4が足されて5になります。

そうしたらまたfor文の最初に戻って今度は6が足されます。最終的にリストの5が足された時点でリストの中身はすべてaに代入されたのでfor文は終了します。

まあfor文が繰り返しをするというのはわかったよ

次は繰り返し処理を使ってトマトの積算温度を求めてみよう。

トマトの積算温度を求める

トマトは積算温度が1100℃から1200℃で収穫できるそうです。

花房段位間の開花周期および開花から果実の収穫までに要する積算温度は,それぞれ200℃および1100~1200℃となった。

北宜裕, トマト半促成栽培における生長解析, 神奈川園試研報 第34号:22~26(1987).

そして肝心の平均気温のデータですが以下の気象庁のページからダウンロードすることができます。

気象庁ホームページ

そうするとcsv形式のデータがダウンロードできます。メモ帳で開いてみてください。

上の方の東京とか平均気温とかの文字列はいらないので削除します。

これを適当な名前(今回は「data加工後.csv」)という名前で保存します。

Windowsのエクスプローラーでこのファイルを右クリックして「パスのコピー」をクリックします。

それをいったんメモ帳にコピーしてください。そして「\」バックスラッシュを「/」に書き換えておきます。というのも「\」は特殊文字なので、プログラム中で不安定な挙動をするんです(と言っても適切に挙動を考えれば問題はありません)。これを回避するために「/」に書き換えます。

そして次のようなプログラムを書きます。

import csv
with open(¥を/に書き換えた、パスのコピーでコピーしたパス) as f:
   reader = csv.reader(f)
   sum = 0
   for t in reader:
      sum += float(t[1])
      if sum>1100:
         print(t[0])
         break

「¥を/に書き換えた、パスのコピーでコピーしたパス」はダブルクォーテーション「”」で囲まれているはずなので、「”」が付いたままの文字列を貼り付けます。

実行すると「2023/6/23」と出力されます。

これは2023/5/1から足し始めているので、ご自分のトマトが開花した日にちのデータから始められるように、適宜csvデータを削除したりして調整して読み込むようにしましょう。

新しい呪文ばっかりでプログラムの意味がわからないんだけど…

これから解説していきます。

まず

with open(¥を/に書き換えた、パスのコピーでコピーしたパス) as f:
   reader = csv.reader(f)

はおまじないだと思ってください。こういう書き方をすれば、対象のファイルを読み込んで、その情報をreaderという変数に格納するということができますという話です。

readerという変数は2次元の配列となっています。reader[0]には[2023/5/1,17.8,8,1]というリストが入っています。リストの中にもう一つリストがあるので二次元リストと言われます。

for t in reader:

の部分は、readerから要素を一つ取り出してtという変数に入れるという意味です。つまりtには最初にreader[0]である[2023/5/1,17.8,8,1]が代入されます。つまりt[0]が「2023/5/1」、t[1]が「17.8」ということになります。

float(t[1])というのは気温の部分の数値を文字列型ではなくfloat型(小数を扱える数値型)に変換しています。readerはcsvファイルの一行を順番に読み込むので、一行の二番目であるt[1]を使えば、気温のデータだけ取り出すことができます。

if sum>1100:

この部分で積算温度が1100℃を超えたかどうか判定しています。もし超えたならt[0]、つまり超えたときの日にちを出力します。

breakはfor文の途中で繰り返し処理を終了する命令文です。超えたかどうかが問題なので、超えたら繰り返し処理は必要ありません。計算を止めてプログラムを終了させます。

また一連のファイル操作はwithのブロック内でだけ有効なので、プログラムを書くときはインデントを適切に使って、withブロックの中で処理を書くようにしましょう。

まとめ

今回はfor文という繰り返し処理について書きました。

順番にまとまったデータを取り出すときなどで活躍します。

ある程度慣れが必要だけど、使っていればわかってくるよ

for文を使いこなしてプログラミングスキルを上げましょう。

当ブログ(シルルスのコードおきば)ではPython入門用の記事を他にも執筆しています。参考になりましたら幸いです。

●Pythonでは日本語変数も使える【変数基礎】

●条件分岐で決まった時間帯にPCの電源モードを変える

●定型処理は関数にまとめる【自動クラムシェルモードにするプログラム】

●補数を使って引き算【原理的なところも解説】