ツェラーの公式、関数版

はてなキーワードツェラーの公式を見てみたら、Perlによる関数が書かれてたから、Pythonでもそれをやってみることにしました。

from decimal import *

def get_day(year, month, date):
    # Zeller's congruence
    if month <= 2:
        month += 12
        year -= 1

    J = Decimal(year) // 100
    K = Decimal(year) % 100
    m = Decimal(month)
    q = Decimal(date)

    h = (q + (((m + 1) * 26) // 10) + K + (K // 4) + (J // 4) - (2 * J)) % 7
    return h

割り算による誤差が出たらいやなので、decimalを使っています。

Perlバージョンにならって、ifの後にreturnを1行で書くこともできるけど、正直なところわかりにくかったので、こうしたやりかたしています。

isinstance(year, int)などとして、int型かどうか判定して、もし違ったらTypeErrorを発生させるのもよさそうだけど、まあ今回はそこまでやる必要ないので、すっとばしました。