if语句中的Ends-with和Starts-with:Python 3

时间:2014-01-24 03:22:40

标签: python if-statement python-3.x startswith ends-with

我是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岁的孩子可以编码:/我做了研究,但我根本没有运气。所以我感谢你花时间去读我的愚蠢问题。

5 个答案:

答案 0 :(得分:5)

更容易:

return (len(DNA) % 3 == 0 and
        DNA.startswith("ATG") and
        DNA.endswith(("TAA", "TAG", "TGA")))

将布尔值与TrueFalse进行比较几乎总是多余的,所以每当你发现自己这样做时......做其他事情; - )

答案 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):