Python 3:如果“if”语句都不成立,如何使用“else”语句?

时间:2018-04-19 19:41:50

标签: python function if-statement python-3.6

对不起,初学者在这里。试图使该程序扫描某个字母组合,如果找不到,则返回“else”语句。但是,如果所有“if”语句都返回False,我无法弄清楚如何仅应用“else”语句。这是我的代码:

class color:
BOLD = '\033[1m'
END = '\033[0m'
GREEN = '\033[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”语句为false,它就会打印“else”语句。所以我假设我需要这样做,所以它不仅仅适用于最后的“if”语句,但我尝试了不同的缩进,它对我不起作用。

我知道这可能是一个非常愚蠢的问题,所以我很抱歉。此外,如果还有其他任何我应该做/知道的事情,以使这个代码更有效,如果你能指出我的资源,那将是很棒的!感谢您的帮助,我真的很感激。

如果你真的很无聊并且想要帮助我,还有其他问题吗:有没有办法让这个函数打印输入序列并突出显示“故障序列”(如红色或其他东西)?这将是非常棒的,但似乎我可能很难用我目前的编码经验水平来完成。

3 个答案:

答案 0 :(得分:4)

您不能拥有多个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
    # ...
elif一样,

else是单个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)

答案 1 :(得分:2)

如果你使用elif构造,它将仅在前一个条件为假时进行测试,因此最终只会运行其中一个代码块。

if some_condition:
    # code
elif another_condition:
    # code
elif yet_another_condition:
    # code
else:
    # code

答案 2 :(得分:0)

创建一个序列和消息列表,如下所示,如果找到则激活一个布尔标志,并且每个序列只测试一个。

请看下面。

例如,对于着色和字体选择,请尝试将结果输出为HTML。您可以在浏览器中获得结果。

    # -*- coding: utf-8 -*-
"""
Created on Thu Apr 19 16:45:55 2018

@author: Carlos
"""

sequences1 = ['aataaa', 'aatgga','aataaa', 'aatgga']
sequences2 = ['aatxaaa', 'aatggxa','aatxaaa', 'aatxgga']

def scan(seq):
    trouble = ['aataaa', 'aatgga']
    message = ['Canonical Poly-A Signal', 'Pea Poly-A Signal']
    ftrouble = False
    for key in range(len(trouble)):
        if trouble[key] in seq:
            print('The trouble sequence, {}, is present'.format(message[key]))
            ftrouble = True
        ### the same format for the previous if statements is repeated for different sequences 
    if not ftrouble:
        print('No trouble sequences are present')

scan(sequences1)

scan(sequences2)