对不起,初学者在这里。试图使该程序扫描某个字母组合,如果找不到,则返回“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”语句,但我尝试了不同的缩进,它对我不起作用。
我知道这可能是一个非常愚蠢的问题,所以我很抱歉。此外,如果还有其他任何我应该做/知道的事情,以使这个代码更有效,如果你能指出我的资源,那将是很棒的!感谢您的帮助,我真的很感激。
如果你真的很无聊并且想要帮助我,还有其他问题吗:有没有办法让这个函数打印输入序列并突出显示“故障序列”(如红色或其他东西)?这将是非常棒的,但似乎我可能很难用我目前的编码经验水平来完成。
答案 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)