2012-04-23 5 views
0

地元の小学生は、次のような形式のライブラリカードIDを持っています。IDは "s"( "student")から始まり、 "s"を含む正確に6文字です。または「t」(「先生」)で始まり、長さの要件はありません。次の関数は有効なIDを取得するはずですが、while条件がありません。Python:いくつかのブール値テストのあるステートメント

def get_valid_id(): 
    '''Prompt the user for and return a valid library card ID.''' 

    s = raw_input("Enter ID: ") 
    while ?????: 
     s = raw_input("Try again: ") 
    return s 

以下は、whileループの条件です。それぞれについて、機能が正しく機能するかどうかを示します。

  1. この条件では、この機能が正しく機能しますか? (s[0] != "s") and (len(s) != 6) and (s[0] != "t")

  2. この条件では、この機能が正しく機能しますか? 1のための答えは何と2がyesではありませんなぜ not((s[0] == "s" and len(s) == 6) or (s[0] == "t"))

は私が得ることはありません。私は最初の質問はすべて "and"なので、2番目の質問は "or"がうまくいかないと思っていたと思っていました。

+4

デモガンの法則。 –

+0

私たちは授業でそれを学んでいませんでした。私はPythonの初心者レベルのクラスです。 – alicew

+1

宿題ですか?うまくいけば、それだけでタグ付けするべきです。 – Shep

答えて

4

誰かがコメントしたよう、DeMorgan's law

ない(AまたはBまたはC)=(ないA)と(いないB)及び(ないC)は

また、考えることは簡単です約not not A = Aと考えているので、必要なステートメントはwhile not Xです。ここで、Xは、という良好なテストです。 idです。

したがって、最初の場合はそうがちょうどs[0] != "s"十分であろう、すなわち、上記サブステートメントの任意のIDパス

not ((s[0] != "s") or (len(s) != 6) or (s[0] != "t")) 

に真され変換されます。第2のケースで

not((s[0] == "s" and len(s) == 6) or (s[0] == "t")) 

いずれか(s[0] == "s" and len(s) == 6)(学生基準)又はs[0] == "t"(教師基準)場合、IDが通過することを意味します。

+1

徹底的な説明Shep。 – alicew

+0

@alicew問題はありません。経験豊富なプログラマでさえ、ブーリアンロジックに乗り遅れてしまっています。頭を掻き、それを見て時間を費やすことが重要です。 – Shep

2

これはは、あなたの質問によると長さ< 6の学生のIDを受け入れますので、学生証の Sを含む長い6つの文字でなければなりませんです。空の文字列を入力しようとすると、両方のオプションが破損することにも注意してください。 s[0]IndexErrorになります。

+0

ご協力ありがとうございます! – alicew

関連する問題