首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python:同时使用几个布尔测试进行声明

python:同时使用几个布尔测试进行声明
EN

Stack Overflow用户
提问于 2012-04-23 04:49:19
回答 2查看 179关注 0票数 0

当地小学有以下形式的借书证ID:ID要么以"s“开头(表示”学生“),要么正好有6个字符长,包括"s";或者以"t”开头(表示“教师”),没有长度要求。下面的函数应该得到一个有效的ID,但是它缺少了它的while条件。

代码语言:javascript
复制
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是肯定的。我认为第一个问题会奏效,因为它是“和”,而第二个问题,我认为“或”不会使它工作。有人能给我解释一下吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-23 05:06:34

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

非(A或B或C) =(非A)和(非B)和(非C)

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

所以第一个案例将转化为

代码语言:javascript
复制
 not ( (s[0] != "s") or (len(s) != 6) or (s[0] != "t") )

也就是说,上述任何子语句的id传递都是真的,所以只要s[0] != "s"就足够了。

在第二个案例中,

代码语言:javascript
复制
not( (s[0] == "s" and len(s) == 6) or (s[0] == "t") )

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

票数 4
EN

Stack Overflow用户

发布于 2012-04-23 05:08:11

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10274935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档