【第5回PYTHON講座】生年月日を入力して 年齢と星座を表示させる ブログラムを作ろう②

PYTHON

こんにちは
前回は年齢を表示させるところまで作成しました。今回では生年月日を入れて年齢と星座を表示して完成させます。

では始めましょう!

星座の名前のリストを作る

まず、星座のリストzodiacを作成します。

zodiac = ["山羊座", "水瓶座", "魚座", "牡羊座", "牡牛座", "双子座", "蟹座", "獅子座", "乙女座", "天秤座", "蠍座", "射手座"]
print(zodiac[0]) #山羊座が出力される
print(zodiac[11]) #射手座が出力される

上記の通り、星座を入力していきます。

そうすると、zodiac[0]には「山羊座」が格納され、zodiac[11]には「射手座」が格納されます。これがリストです。そして、最初のリストの番号が0(ゼロ)から始まることに注意して下さい。

ここでpythonの面白い機能を試してみます。

print(zodiac[-1]) #射手座が出力される
print(zodiac[-12]) #山羊座が出力される

リスト番号にマイナスを入力してみると、後ろから数えた項目が出力されます。わかりますよね?

print(zodiac[12]) #IndexError: list index out of range
print(zodiac[-13]) #IndexError: list index out of range

但し、リスト番号を12、もしくは-13にするとエラー「IndexError: list index out of range」になってしまいます。これは、要素数以上の数値を入力している為です。

では、この星座のリストに日付の情報も加えていきましょう。

星座のリストに日付の範囲を加える

星座は下記の通り日付で分けられます。この日付の範囲を先ほどのリストに加えていきます。

山羊座12/22~1/19牡牛座4/20~5/20乙女座8/23~9/22
水瓶座1/20~2/18双子座5/21~6/21天秤座9/23~10/23
魚座2/19~3/20蟹座6/22~7/22蠍座10/24~11/22
牡羊座3/21~4/19獅子座7/23~8/22射手座11/23~12/21
下記のように、星座リストを、[星座名、星座始まり月、星座始まり日]という形に変更していきます。
zodiac = [
["山羊座", 12, 22], 
["水瓶座", 1, 20], 
["魚座", 2, 19], 
["牡羊座", 3, 21], 
["牡牛座", 4, 20], 
["双子座", 5, 21], 
["蟹座", 6, 22], 
["獅子座", 7, 23], 
["乙女座", 8, 23], 
["天秤座", 9, 23],
["蠍座", 10, 24], 
["射手座", 11, 23]
]
print(zodiac[0]) #["山羊座", 12, 22, 1, 19]が出力される

print(zodiac[0])を実行すると[“山羊座”, 12, 22, 1, 19]が出力されます。

星座の判断の仕方

では、星座の判断の仕方を考えます。

リストの並びは[星座の名前(A)星座始まり月(B)星座始まり日(C)]となっています。

例えば、生まれた月日が「8月15日」とします。

まず、zodiac[0]からzodiac[11]の(B)要素を確認します。該当する配列は、zodiac[9]になります。

次にzodiac[9](C)の要素が15より小さければ、zodiac[9]の(A)の要素が星座に該当し、大きければ、一つ前のzodiac[8]の(A)の要素が星座に該当します。

このように入力された月日から星座を割り出していきます。

では、実際にコードにしてみます。

for i in range(len(zodiac)):
    if zodiac[i][1] == int(birthmonth):
        if zodiac[i][2] <= int(birthday):
            print(f"{name}さんの星座は{zodiac[i][0]}です")
            break
        else:
            print(f"{name}さんの星座は{zodiac[i-1][0]}です")
            break
1行目:ループ処理

for i in range()で繰り返しの処理を行うことになります。0からrange内に入力された数値まで繰り返されます。

len()はzodiacの中に何個の配列があるかを調べる関数で、配列は12個あるので、len(zodiac)は12になります。iの初期値は0なので、iが11になるまでforループが繰り返されます

2行目:多次元配列

zodiacの配列は、3列の配列が12列ある多次元配列になっています。

zodiac内のA行目、B列目にアクセスるにはzodiac[A-1][B-1]と書きます。

例えば、[“魚座”, 2, 19]の2列目の2の値を取得したい場合は、zodiac内3行目の配列の、2列目になるのでzodiac[2][1]という書き方になります。

int(birthmonth)は、前回した文字列を数字(整数)する型変換です。

ifは条件文です。主に、if, elif, elseで最大3つ構成されています。 今回はif、elseのみです。

  • if(1つ以上の条件文)
  • elif(3つ以上の条件文)
  • else(2つ以上の条件文)

そして、大小の比較する場合、下記の演算子を使用します。

  • 等しい: a == b
  • 等しくない: a != b
  • aはbより小さい a < b
  • aはb以下: a <= b
  • aはbより大きい: a > b
  • aはb以上: a >= b
5、8行目:中断 break

breakはループ処理から抜け出す手段です。

コードの間違いなどで、ループ回数が多くなったり、無限ループになってしまう可能性もあるので、break処理を入れる事をおススメします。

プログラム コード

では、前回のプログラムと組み合わせて完成させてみましょう。

import datetime


todaydt = datetime.datetime.now() #todaydtに本日の日付を入力


zodiac = [
    ["山羊座", 12, 22], 
    ["水瓶座", 1, 20], 
    ["魚座", 2, 19], 
    ["牡羊座", 3, 21], 
    ["牡牛座", 4, 20], 
    ["双子座", 5, 21], 
    ["蟹座", 6, 22], 
    ["獅子座", 7, 23], 
    ["乙女座", 8, 23], 
    ["天秤座", 9, 23], 
    ["蠍座", 10, 24], 
    ["射手座", 11, 23]
    ]


name = input("名前を入力して下さい >> ")
birthyear = input("生まれた西暦を入力して下さい(例:1999)>> ") 
birthmonth = input("生まれた月を入力して下さい(例:12) >> ") 
birthday = input("生まれた日を入力して下さい(例:1)")


age01 = todaydt.year - int(birthyear)
print(f"{name}さんの年齢は{age01}歳です")


for i in range(len(zodiac)):
    if zodiac[i][1] == int(birthmonth):
        if zodiac[i][2] <= int(birthday):
            print(birthday)
            print(f"{name}さんの星座は{zodiac[i][0]}です")
            break
        else:
            print(f"{name}さんの星座は{zodiac[i-1][0]}です")
            break

下記の様に結果が出力されましたか?

実行結果

PYTHONではインテンド(intend:字下げ)が重要です。

上記のプログラムで気を付けて頂きたいのは、for文、if文では、インテンド(intend:字下げ)を必ずを合わせなければならないことです。

インテンドというのは字下げで、コードの頭を整える事です。

もちろん、for文, if文以外のコードの頭も合わせなければいけません。

C言語等であれば、文法が正しければ、インテンドは関係ありませんでしたが、PYTHONは必ずしなければなりません

私の場合、インテンドについて知らなかったので、何度もエラーを繰り返していました。みなさんも、もしコードが間違っていないのに、エラーが出るという場合は、インテンドが正しいかを疑ってください。

まとめ

いかがだったでしょうか。

PYTHONはシンプルで解りやすいプログラムであることが実感できたのではないでしょうか。

次回はGUIを使ったプログラムを作ってみたいと思います。

役に立った!」と思れましたら、下のSNSボタンで記事のシェアをしていただけると嬉しいです!

コメント

タイトルとURLをコピーしました