0

地元の小学校は、次の形式の図書館カード ​​ID を持っています。または、「t」(「教師」の意味) で始まり、長さの要件はありません。次の関数は有効な ID を取得するはずですが、while 条件がありません。

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. この状態で関数は正しく機能しますか? not( (s[0] == "s" and len(s) == 6) or (s[0] == "t") )

1の答えがノーで2の答えがイエスである理由がわかりません。最初の質問はすべて「および」なのでうまくいくと思いました.2番目の質問は「または」ではうまくいかないと思いました..誰か私にこれを説明してもらえますか?

4

2 に答える 2

4

誰かがコメントしたように、DeMorgan の法則:

(A または B または C) ではない = (A ではない) および (B ではない) および (C ではない)

それを考慮すると、考えるのも簡単にnot not A = Aなるので、必要なステートメントは、適切なidのテストであるwhile not X場所です。X

したがって、最初のケースは次のように変換されます

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

つまり、上記のサブステートメントのいずれかの id パスが true であるため、それだけ s[0] != "s"で十分です。

2番目のケースでは、

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

(生徒の基準)または(教師の基準)のいずれか の場合に ID が合格することを意味します。(s[0] == "s" and len(s) == 6) s[0] == "t"

于 2012-04-23T05:06:34.203 に答える
2

これは、1が6未満の長さの学生IDを受け入れるためです。あなたの質問によると、学生IDはsを含めて6文字の長さでなければなりません。また、空の文字列を入力しようとすると、両方のオプションが機能しなくなることに注意してください。s[0]を発生させIndexErrorます。

于 2012-04-23T05:08:11.773 に答える