2015-07-15 4 views
0

Я не уверен, что он повторяется через список или вызывается несколько раз ... в любом случае он не должен делать ни одну из этих вещей. Я довольно новичок в python и программировании в целом. Вот функция:Почему моя функция повторяется через список (Python)?

""" 
    Gets the mass that may have an isotope of +1 neutron for C,N or O (if  there is one) 
    @param mass  the mass 
    @return the mass +1 
""" 
def getMassPlus(mass): 
    if (mass)+1 in mass_old2: 
     return (mass)+1 
    elif (mass)+1.1 in mass_old2: 
     return (mass)+1.1 
    elif (mass)+1.2 in mass_old2: 
     return (mass)+1.2 
    elif (mass)+.9 in mass_old2: 
     return (mass)+.9 

и здесь вызов функции:

if ((14.00674*multiplyByN)+(15.994915*multiplyByO)+(1.00794*multiplyByH)) == isotope_masses[i]+.5 or isotope_masses[i]-.5: 
     if isotope_masses[i]+1 or isotope_masses[i]+1.1 or isotope_masses[i]+1.2 or isotope_masses[i]+.9 in mass_old2: 
     nextMass = getMassPlus(isotope_masses[i]) 

Что происходит, что, когда я вызываю функцию, это как-то Перебирает список isotope_masses (который выглядит следующим образом: isotope_masses = [1,2,3,4, ...]) десять раз и присваивает nextMass десять значений. Это также может помочь вам узнать, что второй блок кода является частью более крупного цикла, который выполняет итерацию по длине isotope_masses. Я не совсем уверен, почему эта проблема происходит, любые идеи будут оценены. Заранее спасибо.

Loop:

for i in range(len(isotope_masses)): 
    if not noNitrogen(molecules[i]): #molecule has nitrogen and possibly hydrogen 
    if hasDoubleDig('N'): 
     multiplyByN = int(molecules[i][3:5]) 
     multiplyByH = int(molecules[i][8:]) 
    else: 
     multiplyByN = int(molecules[i][3]) 
     multiplyByH = int(molecules[i][7:]) 
    if ((14.00674*multiplyByN)+(1.00794*multiplyByH)) == isotope_masses[i]+.5 or isotope_masses[i]-.5: 
     if isotope_masses[i]+1 or isotope_masses[i]+1.1 or isotope_masses[i]+1.2 or isotope_masses[i]+.9 in mass_old2: 
      nextMass = getMassPlus(isotope_masses[i]) 
      if float(intensities[mass_old2.index(nextMass)])/float(intensities[mass_old2.index(isotopes_masses[i])]) == multiplyByN * .00364: 
       file_isotopes.append("Isotope: is N-15") 
      else: 
       file_isotopes.append("Mix of isotopes") 
    elif not noCarbon(molecules[i]): #molecule has carbon and possibly hydrogen 
    if hasDoubleDig('C'): 
     multiplyByC = int(molecules[i][1:3]) 
     multiplyByH = int(molecules[i][8:]) 
    else: 
     multiplyByC = int(molecules[i][1]) 
     multiplyByH = int(molecules[i][7:]) 
    if ((12.0107*multiplyByC)+(1.00794*multiplyByH)) == isotope_masses[i]+.5 or isotope_masses[i]-.5: 
     if isotope_masses[i]+1 or isotope_masses[i]+1.1 or isotope_masses[i]+1.2 or isotope_masses[i]+.9 in mass_old2: 

      print isotope_masses[i] 

      nextMass = getMassPlus(isotope_masses[i]) 
      if float(intensities[mass_old2.index(nextMass)])/float(intensities[mass_old2.index(isotope_masses[i])]) == multiplyByC * .0107: 
       file_isotopes.append("Isotope is: C-13") 
      else: 
       file_isotopes.append("Mix of isotopes") 

Существует больше цикла, но его просто повторяющийся, так что я только дал два случая в петле для краткости.

+0

Можете ли вы опубликовать остальную часть кода? В вашем коде нет никакого цикла, который случается в вашем коде, и довольно сложно ответить на вопрос о циклах, не зная структуры цикла. –

+0

Хорошо, я добавил его на свой пост. Дайте мне знать, если вам нужно больше информации – Syd

ответ

0

Я думаю, что ваши утверждения if всегда приравниваются к True.

вместо:

if ((14.00674*multiplyByN)+(15.994915*multiplyByO)+(1.00794*multiplyByH)) == isotope_masses[i]+.5 or isotope_masses[i]-.5 

вам нужна вторая часть условной также быть полное сравнение:

if ((14.00674*multiplyByN)+(15.994915*multiplyByO)+(1.00794*multiplyByH)) == isotope_masses[i]+.5 or ((14.00674*multiplyByN)+(15.994915*multiplyByO)+(1.00794*multiplyByH)) == isotope_masses[i]-.5 

то же самое со вторым условным у вас есть в наличии.

+0

А, это помогло. Но тогда почему это дает мне 10 итераций вместо 5? – Syd

+0

Я предполагаю, что вы делаете это снова в другом месте своего кода. Просмотрите ваши утверждения if и убедитесь, что вы ищете прямые сравнения во всех них. –

0
if isotope_masses[i]+1 or isotope_masses[i]+1.1 or isotope_masses[i]+1.2 or isotope_masses[i]+.9 in mass_old2: 

эквивалентно:

if a or b or c in x: 

в настоящее время оценивается как

if (bool(a) or bool(b) or bool(c)) in x: 

Вы должны изменить его к следующему виду:

if a in x or b in x or c in x: 

Довольно уверен, что это дубликат How do I test one variable against multiple values?

Смежные вопросы