在函数开头计算的值不会在同一函数中被记住

Value that was calculated in the beginning of a function isn't remembered later on in the same function

在函数的开头我计算了一个蛋白质序列的总重量并将其定义为seq_weight。 之后,我计算几个片段的重量,并将这些重量组合起来,总和为第一个蛋白质序列的总重量。 第一个 print 语句正确地打印了总重量,但是在函数末尾,当我想将它定义为总和的结果时,它似乎忘记了那个值。

当我手动输入值时,我得到了我想要的结果:

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:

结果没有像我预期的那样打印权重组合。

抱歉,如果代码有点乱,我还是个初学者。

提前致谢!

问题不在于您的变量不再被记住。问题是您在浮点数之间执行精确比较。在编程中,浮点数是“十进制”数字,但它们不是数字的 精确 表示。它们仅达到 任意 精度。

让我们做一些基本的数学运算 Python。

>>> a = 0.2 + 0.1
>>> a
0.30000000000000004
>>> a == 0.3
False

如您所见,这里显然发生了一些奇怪的事情。但这就是浮点运算的工作原理。


现在我们已经解释过了。你应该怎么做才能让你的程序工作?有多种解决方案。

处理它的一种方法是将您的数字与某个固定差异进行比较。即

if abs(sum(item) - seq_weight) < 0.00001

另一种处理此问题的方法是使用固定精度的小数对象,但这可能比您想象的要困难。 https://docs.python.org/3/library/decimal.html