python:while语句有几个布尔测试

时间:2012-04-23 04:49:20

标签: python boolean-logic

当地小学有以下形式的图书馆卡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") )

  3. 我不明白为什么1的答案是否定的,2是肯定的。我认为第一个问题是可行的,因为它全部是“和”,而第二个问题我认为“或”不会使它工作..有人可以向我解释这个吗?

2 个答案:

答案 0 :(得分:4)

有人评论说,DeMorgan's law

  

不是(A或B或C)=(不是A)和(不是B)和(不是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") )

表示如果 (s[0] == "s" and len(s) == 6)(学生标准) s[0] == "t"(教师标准),则ID会通过。

答案 1 :(得分:2)

这是因为 1 会接受学生ID的长度< 6.根据你的问题,学生id的必须长6个字符,包括s。另请注意,如果您尝试输入空字符串,则两个选项都会中断。 s[0]会提出IndexError