Python 3:如何使"Else"语句仅在所有"if"语句均为真的情况下才适用?

2022-03-25 00:00:00 python function python-3.6 if-statement

问题描述

抱歉,这里是初学者。尝试编写此程序来扫描特定的字母组合,如果没有找到,则返回"Else"语句。但是,我不知道如何让"Else"语句仅在所有"if"语句都返回false时才适用。以下是我的代码:

class color:
BOLD = '33[1m'
END = '33[0m'
GREEN = '33[92m'

print("Welcome to the Sequence Scanner")
print(" ") ## just putting a space between the welcome message and the input box
seq = input("Provide your nucleotide sequence here: ")

def scan():
    if 'aataaa' in scan():
        print('The trouble sequence, Canonical Poly-A Signal, is present')
    if 'aatgga' in scan():
        print('The trouble sequence, Pea Poly-A Signal, is present')
    ### the same format for the previous if statements is repeated for different sequences 
    else: 
        print(color.GREEN + 'No trouble sequences are present' + color.END)
scan(seq)
现在,只要最后一条"if"语句为假,它就会打印"Else"语句。所以我假设我需要这样做,这样它不仅适用于最后一个"if"语句,而且我已经尝试了不同的缩进,它对我来说就是不起作用。

我知道这可能是一个非常愚蠢的问题,所以我提前向您道歉。此外,如果有任何其他我应该做/知道的事情来提高代码的效率,如果您能为我提供相关的参考资料,那就太棒了!谢谢你的帮助,我真的很感激。

如果您真的很无聊并想帮我解决其他问题:有没有办法让函数打印输入序列,并突出显示"故障序列"(如红色或其他颜色)?那太棒了,但以我目前的编码经验,似乎太难做到这一点了。


解决方案

您不能有多个if语句和一个else挡路并让它们一起工作。每个if部分开始一个独立的独立语句,因此第一个if是一个语句,然后if...else是另一个独立于第一个语句的语句。第一个if中发生了什么并不重要,第二个if中发生了什么并不重要。

如果希望第二个和第一个if测试一起工作,则需要改用elif;这样就形成了一个包含额外测试的完整if语句:

if 'aataaa' in scan():     # if this one doesn't match
    # ...
elif 'aatgga' in scan():   # only then test this one
    # ...
else:                      # and if either failed then go here
    # ...

elifelse类似,是单个if语句的一部分。您可以根据需要添加更多elif部件,然后按顺序尝试每个测试,直到一个测试通过或elif测试用完,此时如果没有匹配的else部件就会执行。

参见if statement documentation:

[if语句]通过逐个评估表达式,直到发现一个表达式为真[.],从而精确选择一个套件;然后执行该套件(并且不执行或评估if语句的任何其他部分)。如果所有表达式都为False,则执行else子句套件(如果存在)。

语法显示,单个if语句可以包含一个if部分、任意数量的elif部分(( ... )*表示0个或更多)和可选的else部分([...]表示可选):

if_stmt ::=  "if" expression ":" suite
             ( "elif" expression ":" suite )*
             ["else" ":" suite]

另一方面,如果要执行所有测试,如果不匹配则执行单独的挡路,则需要使用循环;设置标志以指示没有匹配的测试,或者保留计数等,并在结束时测试标志或计数:

def scan(seq):
    tests = [
        ('aataaa', 'The trouble sequence, Canonical Poly-A Signal, is present'),
        ('aatgga', 'The trouble sequence, Pea Poly-A Signal, is present'),
        # more tests
    ]
    found_match = False
    for value, message in tests:
        if value in seq:
            print(message)
            found_match = True

    if not found_match:
        print(color.GREEN + 'No trouble sequences are present' + color.END)

相关文章