0

1900 年から 2099 年までのイースターの日付を計算するスクリプトを書いています。問題は、4 つの特定の年 (1954 年、1981 年、2049 年、および 2076 年) では式が少し異なるということです (つまり、日付がずれています 7日々)。

def main():
    print "Computes the date of Easter for years 1900-2099.\n"

    year = input("The year: ")

    if year >= 1900 and year <= 2099:
        if year != 2049 != 2076 !=1981 != 1954:
            a = year%19
            b = year%4 
            c = year%7
            d = (19*a+24)%30
            e = (2*b+4*c+6*d+5)%7
            date = 22 + d + e     # March 22 is the starting date
            if date <= 31:
                print "The date of Easter is March", date
            else:
                print "The date of Easter is April", date - 31
        else: 
            if date <= 31:
                print "The date of Easter is March", date - 7 
            else:
                print "The date of Easter is April", date - 31 - 7
    else:
        print "The year is out of range."   


main()

Exerything はうまく機能していますが、4 年間の計算です。

if date <= 31: UnboundLocalError: local variable 'date' referenced before assignment入力として 4 年のいずれかを入力するたびに、次の値を取得して います。

4

1 に答える 1

1

そのような式を連鎖させることはできません。and演算子を使用してテストを連鎖させるか、not in代わりに式を使用します。

# and operators
if year != 2049 and year != 2076 and year != 1981 and year != 1954:

# not in expression
if year not in (2049, 2076, 1981, 1954):

この表現は別のものを意味し、代わりにyear != 2049 != 2076 !=1981 != 1954解釈されます。(((year != 2049) != 2076) !=1981) != 1954最初のテストは または のいずれTrueFalseであり、これら 2 つの値のいずれも他の数値と等しくなることはなく、その分岐は常に と評価されFalseます。

ただし、ブランチが参照するため、 UnboundLocalErrorfor を取得しますが、そのブランチに設定されることはありません。ブランチが実行されると、Python が認識するのは次のすべてです。dateelsedateelse

def main():
    print "Computes the date of Easter for years 1900-2099.\n"

    year = input("The year: ")

    if year >= 1900 and year <= 2099:
        if False:    
            # skipped
        else: 
            if date <= 31:
                print "The date of Easter is March", date - 7 
            else:
                print "The date of Easter is April", date - 31 - 7

dateその場合、値が割り当てられることはありません。dateそのブランチで個別に計算するdate、値の計算をifステートメントから完全に移動する必要があります。私はイースターの計算に詳しくないので、この場合に何をする必要があるかわかりません.

于 2013-02-02T13:43:30.347 に答える