请说明

时间:2018-10-13 23:45:49

标签: python bioinformatics

这是我在此网站上的第一个问题。对于一些背景知识,我对将机器学习应用于预防医学非常感兴趣,因为我相信这就是医学的未来。因此,我一直在通过Rosalind.info自学python。一个问题使我们创建了一个可以计算序列GC含量的函数。我遇到的一个问题是,当我使用第一个代码时,它评估为一个。但是,当我使用第二个代码时,它评估为正确的答案。如果有人能解释为什么是这种情况,将不胜感激!

第一次尝试:

n = input("Paste in sequence here!").upper()

def cg_content(sequence):
    gc_count = 0
    total = len(sequence)
    for base in sequence:
        if base =='C' or 'G':
            gc_count += 1
        else:
            gc_count = gc_count
    percentage = float(gc_count)/float(total)
    print(percentage) 

cg_content(n)

第二次尝试:

n = input("Paste in sequence here!").upper()

def cg_content(sequence):
    gc_count = 0
    total = len(sequence)
    for base in sequence:
        if base =='C' or base == 'G':
            gc_count += 1
        else:
            gc_count = gc_count
    percentage = float(gc_count)/float(total)
    print(percentage) 

cg_content(n)

我知道它与'or'语句有关,但是我认为无论'=='是否存在一次或两次,这两个语句在本质上都是等效的。

3 个答案:

答案 0 :(得分:2)

获得不同输出的原因在于:

if base =='C' or 'G':

与以下内容不同:

if base =='C' or base == 'G':

在第一种情况下,您要评估表达式'G'的真值,该表达式是类型char的变量。 Python documentation表示:

  

默认情况下,除非对象的类定义   返回False的 bool ()方法或 len ()方法   与对象一起调用时返回零。

因此,if 'G'的求值始终为true。


有趣的故事

即使'G'的评估结果为True,以下表达式的评估结果也为False

if 'G' == True:
    print("I will be never printed")

答案 1 :(得分:1)

不一样。第一个代码基本上是:

if (base == 'C') or ('G'):

或换句话说,if base == 'C'为真,或if 'G'为真。显然if 'G'没有任何意义。通常,0 = false,非零= true,因此if 'G'可能始终为true。

因此,您说的是if base == 'C' or True,这将始终为真,因此第一个if子句始终会获胜。 or True等于True ...什至if False or True;)

答案 2 :(得分:0)

在python中,任何非空字符串都被解释为True(肯定)

因此,base == 'C' or 'G'(base =='C') or 'G'相同,而无论base的值是什么。

尽管Python通常是直观而优雅的,但它在解释代码时遵循一些严格的规则集,而不是常识。将非空/非空值解释为True值的传统源于标准Python解释器与之紧密互操作的C。它不是很严格或直观,但通常允许使用更简单,更优雅的代码。