2

有人能告诉我为什么当我用这个特定的例子尝试这个函数时:is_valid_sequence('ABCDEFG'),它出现的是“True”而不是“False”?一般来说,我对编程完全陌生。这是我正在参加的在线课程。谢谢。

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
4

6 回答 6

11

你回来得太早了。尝试这个

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

或更简单地说

return all(char in 'ACTG' for char in dna_sequence)
于 2012-10-22T05:03:42.490 回答
3

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

您需要遍历整个字符串并查看所有字符是否匹配。

于 2012-10-22T05:04:43.240 回答
2

因为你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

但是还有更多的“pythonic”方法可以做到这一点,all()例如看一下函数

于 2012-10-22T05:03:27.797 回答
1

发生的情况是,一旦它击中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
于 2012-10-22T05:04:24.333 回答
0

return 导致函数退出,无论如何这只会检查一个字符

for char in dna_sequence:
    if char not in 'ACTG':
        return False
return true # after whole string checked 
于 2012-10-22T05:04:20.353 回答
0

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

for char in dna_sequence:
    if char not in 'ACTG':
        return False
return True
于 2012-10-22T05:08:19.727 回答