这是我在此网站上的第一个问题。对于一些背景知识,我对将机器学习应用于预防医学非常感兴趣,因为我相信这就是医学的未来。因此,我一直在通过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'语句有关,但是我认为无论'=='是否存在一次或两次,这两个语句在本质上都是等效的。
答案 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。它不是很严格或直观,但通常允许使用更简单,更优雅的代码。