2

不等演算子を使用しweekendて、入力として文字列を受け取り、Trueそれが「土曜日」または「日曜日」の場合はブール値を返し、それ以外の場合はブール値を返すプロシージャを定義する必要がありFalseます。

これが私のコードです

def weekend(day):
    if day != 'Saturday' or day != 'Sunday':
        return False
    else:
        return True

Falseこれは一見毎日に戻るようですが、理由はわかりませんが、論理的にはうまくいくでしょう... 誰か説明してもらえますか?

4

6 に答える 6

6

修正版:

if day != 'Saturday' and day != 'Sunday'

より良いバージョン:

return day in ['Saturday', 'Sunday']

or機能しない理由:

を使用するorと、条件は「今日が土曜日でない場合、または今日が日曜日でない場合」のようになります。「今日」を「土曜日」に置き換えます。

土曜日が土曜日でない場合、または土曜日が日曜日でない場合

「Saturday is not Saturday」というステートメントは明らかに false であり、「Saturday is not Sunday」は明らかに true であるため、ステートメント全体が「if false or true」になり、常に true になります。

「今日」を他の日に置き換えると、文は常に次のいずれかの文に評価されることがわかります。これらは常に真です。

if True or False  # day = Sunday
if False or True  # day = Saturday
if True or True   # any other day
于 2012-08-11T05:01:56.450 に答える
5

これに対処する最善の方法は、次のようなものを使用します。

return day.lower() in ['saturday','sunday']
于 2012-08-11T05:03:19.513 に答える
1

もしかしてand

def weekend(day):
    if day != 'Saturday' and day != 'Sunday':
        return False
    else:
        return True

またはより明確なバージョン(De Morganを上記に適用するだけです):

def weekend(day):
    if day == 'Saturday' or day == 'Sunday':
        return True
    else:
        return False

その日は常に両方の日のうちの1 つとは異なります。

于 2012-08-11T05:02:28.983 に答える
0

将来のためのヒント:自分がコンピュータであるかのように、非常に詳細にコードを考えてみてください。たとえば、私は文字通り自分自身と次のような会話をします。

うーん、 の場合day = 'Saturday'、コードは返さFalseれるべきではないと思いますが返されます。行ごとに何が起こっているか見てみましょう。

def weekend(day):

  • dayよし、今から良さそう 気がついたら差し替えよう'Saturday'

if day != 'Saturday' or day != 'Sunday':

  • わかりましたので、これを精神的に に翻訳しif 'Saturday' != 'Saturday' or 'Saturday' != 'Sunday':ます。
  • ここで、比較を評価して単純化します。
    • 'Saturday' != 'Saturday'になるFalse
    • 'Saturday' != 'Sunday':になるTrue
  • それらを差し込むと、ifステートメントが とif False or True同じであると言っていることがわかりif Trueます。つまりday = Saturday、 の戻り値につながりますFalse

day = 'Saturday'ああ、これでケースの何が問題だったのかわかりました。day != 'Sunday'条件は、 が にif評価されたことを意味しTrueます。

したがって、以下のコードはTrueforを返しますがday = 'Saturday'

def weekend(day):
    if day != 'Saturday':
        return False
    else:
        return True

このコードはday = 'Sunday'

def weekend(day):
    if day != 'Sunday':
        return False
    else:
        return True

2 つを と組み合わせることはできませんor

したがって、将来はそのように自分自身に話しかけてみてください。これは、特に紛らわしいブール論理がある場合に、デバッグに非常に役立ちます。

return day.lower() in ['saturday','sunday'](記録として、これがこれにアプローチする最良の方法だと思います。)

于 2012-08-11T05:38:19.713 に答える
0

Can not get “while” statement to progressに対してこの回答を書きましたが、送信する直前に重複としてマークされました。そして、それは正確な論理的複製 ( x != foo or y != bar) であるため、私の答えが誰かの助けになることを期待して、ここに投稿しています。

答えは逐語的に再現されます。


あなたの問題はここにあります:

while username != logindata.user1 or username != logindata.user2:
...
while password != logindata.passw1 or password != logindata.passw2:

英語のユーザー名のループは、「提供された が と等しくないusernameか、 と等しくない場合、ループを続ける」のようなものです。とが同じでない限り、文字列が に評価されることはありません。'username' が と等しい場合、 と等しくなることはありません(ここでも、 を想定しています)。user1user2user1user2Falseuser1user2user1 != user2

簡単な修正は、 を に変更するorことandです。そうすればusername、利用可能なオプションのいずれでもないかどうかを確認できます。それを書くためのより良い方法は次のとおりです。

while not (username == logindata.user1 or username == logindata.user2):

しかし、あなたがやろうとしていることを考えると、それを書く正しい方法は次のとおりです。

while username not in [logindata.user1, logindata.user2]:

英語では、「ユーザー名がこのユーザー名のリストにない間、ループを続けてください」のようなものです。

PS私はリストの代わりにセットを使用するつもりでした. 他の誰かがする前にそれを言及するだけです:)。

于 2018-12-03T04:17:11.830 に答える
0
def weekend(day):
    # your code here
    if day == 'Saturday' or day == 'Sunday':
        return True
    else:
        return False
于 2016-10-03T13:09:40.833 に答える