我是python的新手,我必须创建一个验证DNA序列的程序。 (关于DNA序列的背景非常快) 为了有效: •字符数可被3整除 •前3个字符是ATG •最后3个字符是TAA,TAG或TGA。
我的问题在if语句中使用布尔术语。
endswith=(DNA.endswith("TAA"))
endswith2=(DNA.endswith("TAG"))
endswith3=(DNA.endswith("TGA"))
if length%3==0 and startswith==true and endswith==true or endswith2==true or endswith3==true:
return ("true")
此代码返回以下错误: 全局名称'true'未定义
我如何解决这个问题,而且只是在最后一个说明中我很抱歉。 这个问题的答案可能是非常简单的,在你的脑海中,一个2岁的孩子可以编码:/我做了研究,但我根本没有运气。所以我感谢你花时间去读我的愚蠢问题。
答案 0 :(得分:5)
更容易:
return (len(DNA) % 3 == 0 and
DNA.startswith("ATG") and
DNA.endswith(("TAA", "TAG", "TGA")))
将布尔值与True
或False
进行比较几乎总是多余的,所以每当你发现自己这样做时......做其他事情; - )
答案 1 :(得分:2)
在python中,true
不是关键字,而是True
。
在python中,您不必明显地将变量与True
进行比较,只需使用
if length%3==0 and startswith and endswith or endswith2 or endswith3:
答案 2 :(得分:1)
首先:它是True
而不是true
。
第二件事:不要说endswith == True
,只说endswith
。
第三件事:and
的优先级高于or
,所以你所写的内容相当于:
(length%3==0 and startswith==true and endswith==true) or ...
这不是你的意思。
第四件事:最好说:
if len(DNA) % 3 == 0 and DNA.startswith('ATG') and DNA[-3:] in ('TAA', 'TAG', 'TGA'):
蒂姆指出,DNA.endswith(('TAA', 'TAG', 'TGA'))
击败DNA[-3:] in ...
。它更简单,没有经过考验,我希望它也会更快。如果你有很多相等长度的允许结尾,并且你正在做很多测试,那么构造set
一次并对末端切片进行in
测试会更快。但是,三种可能性并非“很多”。
答案 3 :(得分:0)
type:true - >真
在提问之前,最好先参考手册。
实际上,你可以使用它:
if length%3 and startswith and endswith or ...
无需编写
if ... startswith == True ...
答案 4 :(得分:0)
使用True
,而不是true
。另外,您可以使用startswith==True
(例如:startswith
)代替if length%3==0 and startswith and endswith ...
。
您还应该添加括号以使您的逻辑更具可读性。尽管优先权已有详细记载,但许多人并不了解它。即使他们这样做,也无法判断你是否做了。
if (length%3==0 and (startswith and endswith) or endswith2 or endswith3):