Function 在函数开头计算的值为';我后来在同一个函数中记不起来了
在函数的开头,我计算了蛋白质序列的总重量,并将其定义为seq_-weight。 之后,我计算了几个片段的重量,并将这些重量组合起来,相加为第一个蛋白质序列的总重量。 第一个print语句正确地打印了总权重,但在函数末尾,当我想将其定义为求和的结果时,它似乎忘记了该值 当我手动键入值时,我会得到我想要的结果:Function 在函数开头计算的值为';我后来在同一个函数中记不起来了,function,for-loop,if-statement,sum,biopython,Function,For Loop,If Statement,Sum,Biopython,在函数的开头,我计算了蛋白质序列的总重量,并将其定义为seq_-weight。 之后,我计算了几个片段的重量,并将这些重量组合起来,相加为第一个蛋白质序列的总重量。 第一个print语句正确地打印了总权重,但在函数末尾,当我想将其定义为求和的结果时,它似乎忘记了该值 当我手动键入值时,我会得到我想要的结果: def fragmentcombinations(sequence, fragments):
def fragmentcombinations(sequence, fragments):
for seq_rec in sequence:
seq_weight = 0.0
for i in seq_rec.seq:
seq_weight += SeqUtils.molecular_weight(i, "protein")
print("The protein sequence: " + seq_rec.seq)
print("The molecular weight: " + str(round(seq_weight, 2)) + " Da.")
nums = []
for a in fragments:
fragment_weights = 0.0
for aa in a.seq:
fragment_weights += SeqUtils.molecular_weight(aa, 'protein')
nums.append(round(fragment_weights, 2))
print(nums)
weights_array = []
combs = []
if len(nums) > 0:
for r in range(0,len(nums)+1):
weights_array += list(combinations(nums, r))
for item in weights_array:
if sum(item) == 4364.85: #Sequence weight needs to inserted manually -> not ideal
combs.append(item)
print(" ")
print("The possible combinations of fragment weights that may cover the protein sequence without overlap are: ")
for row in combs:
print(*row, sep = ", ")
fragmentcombinations(seq_list3, seq_list4)
结果是:
The protein sequence: IEEATHMTPCYELHGLRWVQIQDYAINVMQCL
The molecular weight: 4364.85 Da.
[3611.86, 2269.63, 469.53, 556.56, 1198.41, 2609.88, 547.69, 1976.23, 2306.48, 938.01, 1613.87, 789.87, 737.75, 2498.71, 2064.25, 1184.39, 1671.87]
The possible combinations of fragment weights that may cover the protein sequence without overlap are:
556.56, 1198.41, 2609.88
469.53, 2609.88, 547.69, 737.75
556.56, 1198.41, 938.01, 1671.87
469.53, 547.69, 938.01, 737.75, 1671.87
如果我写
if sum(item) == seq_weight:
结果并没有像我预期的那样打印权重的组合
抱歉,如果代码有点乱,我还是个初学者
提前谢谢 问题不在于您的变量不再被记住。问题是要在浮点数之间执行精确比较。在编程中,浮点数是“十进制”数,但它们不是数字的精确表示形式。它们只能达到任意精度 让我们做一些基础数学
>>> a = 0.2 + 0.1
>>> a
0.30000000000000004
>>> a == 0.3
False
正如你所看到的,这里显然发生了一些奇怪的事情。但这正是浮点运算的工作原理
现在我们已经解释过了。你应该怎么做才能使你的计划有效?有多种解决方案 处理这个问题的一种方法是将你的数字与固定的差值进行比较。即
if abs(sum(item) - seq_weight) < 0.00001
如果abs(总和(项目)-序号重量)<0.00001
另一种处理方法是使用固定精度的十进制对象,但这可能比您想象的要困难 问题不在于您的变量不再被记住。问题是要在浮点数之间执行精确比较。在编程中,浮点数是“十进制”数,但它们不是数字的精确表示形式。它们只能达到任意精度 让我们做一些基础数学
>>> a = 0.2 + 0.1
>>> a
0.30000000000000004
>>> a == 0.3
False
正如你所看到的,这里显然发生了一些奇怪的事情。但这正是浮点运算的工作原理
现在我们已经解释过了。你应该怎么做才能使你的计划有效?有多种解决方案 处理这个问题的一种方法是将你的数字与固定的差值进行比较。即
if abs(sum(item) - seq_weight) < 0.00001
如果abs(总和(项目)-序号重量)<0.00001
另一种处理方法是使用固定精度的十进制对象,但这可能比您想象的要困难 嗨,希尔克,谢谢你的帮助!遗憾的是,新的if声明没有起作用。你还有其他的建议吗?如果没有,那没问题。提前感谢。@BenDeCoensel,如果问题在我这方面是可重复的(即示例代码+运行并显示问题的示例输入),这将有助于诊断问题。(同样对于你在这里提出的任何未来问题。)Hi@Hielke Walinga,我发现了另一个解决方案,它只是将总和等于四舍五入(seq_weight,2),我认为这样你解释的奇怪的浮动转换就不会发生了。谢谢你的帮助@BendeCoense或多或少都会变硬,但它更容易断裂。您还应该对
求和(项)
进行四舍五入,因为在求和过程中可能会出现浮点错误。Hi Hielke,谢谢您的帮助!遗憾的是,新的if声明没有起作用。你还有其他的建议吗?如果没有,那没问题。提前感谢。@BenDeCoensel,如果问题在我这方面是可重复的(即示例代码+运行并显示问题的示例输入),这将有助于诊断问题。(同样对于你在这里提出的任何未来问题。)Hi@Hielke Walinga,我发现了另一个解决方案,它只是将总和等于四舍五入(seq_weight,2),我认为这样你解释的奇怪的浮动转换就不会发生了。谢谢你的帮助@BendeCoense或多或少都会变硬,但它更容易断裂。您还应该对和(项)
进行四舍五入,因为在求和过程中也可能出现浮点错误。