当地小学有以下形式的图书馆卡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循环的一些可能条件。对于每个,指示它是否会使该功能正常工作。
此条件是否会使该功能正常工作?
(s[0] != "s") and (len(s) != 6) and (s[0] != "t")
此条件是否会使该功能正常工作?
not( (s[0] == "s" and len(s) == 6) or (s[0] == "t") )
我不明白为什么1的答案是否定的,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
。