@taka0912

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Python の If 文で土日か祝日かを分岐できません

Q&A

Closed

Frigeは明日学校があるのかわかっていません。祝日または土日の場合、基本的に学校はありません。明日の曜日dayとその日が祝日かどうかをあらわすブーリアン値isHoliday(祝日ならtrue、そうでないならfalse)が与えられるので、学校があるか判定するisThereSchoolという関数を作成してください。

この問題分かる方ご協力よろしくお願いします。

入出力の例です
IsThereSchool("Sunday",true) --> false

IsThereSchool("Sunday",false) --> false

IsThereSchool("Monday",true) --> false

IsThereSchool("Monday",false) --> true

IsThereSchool("Custom String Input",false) --> true

自分で下記のように書いたのですが、
違うみたいでどのように修正したらよいかわからないです。

def IsThereSchool(day,isHoliday):
#ここから書きましょう
if day == 'Sunday' or 'Saturday':
return False
elif isHoliday == False:
return True
else:
return False

0 likes

1Answer

TL; DR(概要)

おそらく、すべての実行結果が False になるのだと思います。
原因は、if day == 'Sunday' or 'Saturday' の箇所です。

if day == 'Sunday' or 'Saturday':
if (day == 'Sunday') or (day == 'Saturday'):

TS; DR(詳細)

全ソース・コード

修正版ソースコード

修正版

def IsThereSchool(day,isHoliday):
    if (day == 'Sunday') or (day == 'Saturday'):
        return False
    elif isHoliday == False:
        return True
    else:
        return False

result='true' if IsThereSchool("Sunday",True) else 'false'
print(result)
result='true' if IsThereSchool("Sunday",False) else 'false'
print(result)
result='true' if IsThereSchool("Monday",True) else 'false'
print(result)
result='true' if IsThereSchool("Monday",False) else 'false'
print(result)
result='true' if IsThereSchool("Custom String Input",False) else 'false'
print(result)

# 出力結果
# false
# false
# false
# true
# true

私ならこう書く機動隊


IS_SCHOOL=True
NO_SCHOOL=False

def IsThereSchool(day,isHoliday):
    if isHoliday == True:
        return NO_SCHOOL
    if (day == 'Sunday') or (day =='Saturday'):
        return NO_SCHOOL
    return IS_SCHOOL

# Assertion(期待する答えと実際の答えが同じか評価する)
def Assert(expect,actual):
    print('OK') if expect==actual else print('NG')

# テスト実行
Assert(NO_SCHOOL, IsThereSchool("Sunday",True))
Assert(NO_SCHOOL, IsThereSchool("Sunday",False)) 
Assert(NO_SCHOOL, IsThereSchool("Monday",True))
Assert(IS_SCHOOL, IsThereSchool("Monday",False))
Assert(IS_SCHOOL, IsThereSchool("Custom String Input",False))
Assert(NO_SCHOOL, IsThereSchool("Custom String Input",True))

# 出力結果
#OK
#OK
#OK
#OK
#OK
#OK

足し算と掛け算で計算する順番があるように、プログラムにも計算する順番があります。

リンク先をみると、OR== より上、つまり先に評価(チェック)され実行されます。この実行される順番を「評価順序」といいます。

つまり、以下の2つは同じ意味になります。

if day == 'Sunday' or 'Saturday':
    ...
if day == ('Sunday' or 'Saturday'):
    ....

('Sunday' or 'Saturday') は常に True なので、以下と同じ意味になり、常に False が返ってしまうのです。

常にFalseが返ってしまう
if day == True:
    return False

このような順番で式が評価(チェック)されているので、意図しない答えが返ってくるのです。

1Like

Comments

  1. @taka0912

    Questioner

    わかりやすいご回答ありがとうございました。
  2. @taka0912

    この質問のタイトルを変えられた方が良いと思います。質問一覧をながめていて良い印象がありません。

    「Python の If 文で土日か祝日かを分岐できません」などいかがでしょうか。
  3. @taka0912

    Questioner

    わかりました。
    タイトル変更します。

Your answer might help someone💌