2012-10-22 157 views
2

有人能告訴我爲什麼當我用這個特殊的例子試用這個函數: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 

回答

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 

但也有更多的「Python化」的方式來做到這一點,看看在all()功能例如

+0

是的,我想象這是問題所在。但是,我該如何解決它? –

+0

你真的會用'&='嗎?順便說一句,你忘了返回'res' –

+0

不,這是爲了解釋,我會去所有() – 2012-10-22 05:10:01

11

你太早回來。試試這個

或者更簡單地說

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

'all'可能更pyiousonic。 –

+0

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

+0

完美,謝謝!這固定它! –

0

回報導致函數的出口無論什麼這將只檢查一個字符

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

謝謝你呢! –

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 
+0

謝謝!這幫助了我! –

3

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

你需要通過整個字符串,看看所有字符匹配。

0

在循環中,如果第一個值匹配,則返回True,而不是檢查所有值。更正後的代碼:

相關問題