这个函数为什么会返回错误的结果?

问题描述:

有人能告诉我为什么当我用这个特殊的例子试用这个函数:is_valid_sequence('ABCDEFG'),它出现“真”而不是“假”?一般来说,我对编程完全陌生。这是我正在参加的在线课程。谢谢。这个函数为什么会返回错误的结果?

def is_valid_sequence(dna_sequence): 
    ''' (str) -> bool 

    Return True if and only if DNA sequence is made up of 'A', 'T', 'C', and 'G' nucleotides. 

    >>> is_valid_sequence('ATCGGC') 
    True 
    >>> is_valid_sequence('aTcGGc') 
    False 
    >>> is_valid_sequence('ABCDEFG') 
    False 

    '''  

    for char in dna_sequence: 
     if char not in 'ACTG': 
      return False 
     else: 
      return True 

因为您使用return只有第一个char得到测试。

简单的修正:

res = True 
for ch in dna_sequence: 
    if ch not in 'ACTG': 
     res &= False # or return as you know it's false 
    else: 
     res &= True 
return res 

但也有更多的“Python化”的方式来做到这一点,看看在all()功能例如

+0

是的,我想象这是问题所在。但是,我该如何解决它? –

+0

你真的会用'&='吗?顺便说一句,你忘了返回'res' –

+0

不,这是为了解释,我会去所有() – 2012-10-22 05:10:01

你太早回来。试试这个

或者更简单地说

return all(char in 'ACTG' for char in dna_sequence) 
+0

'all'可能更pyiousonic。 –

+0

+1(all)():) – 2012-10-22 05:07:23

+0

完美,谢谢!这固定它! –

回报导致函数的出口无论什么这将只检查一个字符

for char in dna_sequence: 
    if char not in 'ACTG': 
     return False 
return true # after whole string checked 
+0

谢谢你呢! –

会发生什么事,一旦是因为它点击A,它返回True。你的逻辑需要有来无回,直到遇到一个无效的字符或字符串的结尾:

for char in dna_sequence: 
     if char not in 'ACTG': 
      return False 
    # we hit the end of the string, so it must be valid 
    return True 
+0

谢谢!这帮助了我! –

你的方法将退出在相匹配的第一字符。由于ABCDEFG的第一个字符是有效字符,因此您的方法返回True

你需要通过整个字符串,看看所有字符匹配。

在循环中,如果第一个值匹配,则返回True,而不是检查所有值。更正后的代码: