0

当地小学的借书证 ID 格式如下: ID 以“s”(代表“学生”)开头,长度正好为 6 个字符,包括“s”;或者它们以“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 的答案是肯定的。我认为第一个问题会起作用,因为它都是“和”,而第二个问题我认为“或”不会使它起作用..有人可以向我解释一下吗?

4

2 回答 2

4

正如有人评论的那样,德摩根定律

not (A or B or C) = (not A) and (not B) and (not C)

当您考虑这一点时,也更容易考虑not not A = A,因此您需要的语句是while not X哪里X是一个好的id 的测试。

所以第一种情况将转化为

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

即上述任何子语句的 id 通行证都是正确的,所以 s[0] != "s"足够了。

在第二种情况下,

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 的长度必须为 6 个字符,包括 s。另请注意,如果您尝试输入空字符串,这两个选项都会中断。s[0]将引发IndexError.

于 2012-04-23T05:08:11.773 回答