Ответы, здесь сосредоточены на двух различных аспектах решения вашей проблемы:
- очень конкретное решение для вашей ошибки (
int is not iterable
), путем исправления код.
- Немного больше о том, как обращаться с кодом.
Что касается , комментарий к вашему вопросу отметил вопрос: синтаксис кортежа-распаковка во внутреннем цикле. Пример кортежа распаковке бы
a,b = ['a','b']
Здесь, Python бы первый элемент правой стороны (РИТ) и присвоить его имя на левой стороне (LHS), вторая элемент RHS и присвоить его второму имени в LHF.
Ваш внутренний цикл, разломы, for index, y in range(index + 1, 1000000000)
, эквивалентно пытаться сделать
index, y = 1
Теперь целое не является совокупность элементов, так что это не будет работать.
Что касается , вы должны сосредоточиться на стратегии модульности, который в основном означает, что вы пишете функцию для каждого суб-проблемы. Для этого был почти рожден Питон. (. Обратите внимание, что эта стратегия не обязательно означает, что написание Python-модулей для каждой подзадачи)
В вас случае, ваша главная цель может быть разделена на несколько подзадач:
- Получение молекулярных последовательностей.
- Разделить последовательности на отдельные последовательности.
- Разбиение последовательности на ее H, C и O-элементы.
- Учитывая количество атомов H, C и O, вычислите молекулярный вес.
Этап 3 и 4 являются отличными кандидатами на независимые функции, поскольку их основная проблема изолирована от остального контекста.
Здесь, я полагаю, мы только получаем 1 последовательность в то время, и что они могут быть в форме:
Шаг 3:
def GetAtoms(sequence):
'''
Counts the number of C's, H's and O's in sequence and returns a dictionary.
Only works with a numeric suffices up to 9, e.g. C10H12 would not work.
'''
atoms = ['C','H','O'] # list of which atoms we want to count.
res = {atom:0 for atom in atoms}
last_c = None
for c in sequence:
if c in atoms:
res[c] += 1
last_c = c
elif c.isdigit() and last_c is not None:
res[last_c] += int(c) - 1
last_c = None
else:
last_c = None
return res
Вы можете видеть, что независимо от того, как вы получаете последовательность и как рассчитывается молекулярный вес, этот метод работает (в соответствии с предварительными условиями). Если впоследствии вам нужно расширить возможности получения атома, это можно изменить, не затрагивая оставшуюся логику.
Шаг 4:
def MolecularWeight(atoms):
return atoms['H']*1 + atoms['C']*8 + atoms['O']*18
Теперь ваша общая логика может быть такой:
while True:
chemicalFormula = input("Enter the chemical formula, or enter key to quit: ")
if len(chemicalFormula) == 0:
break
print 'Molecular weight of', chemicalFormula, 'is', MolecularWeight(GetAtoms(chemicalFormula))
Какова цель внутреннего цикла? –
Где именно вы намерены получить 'y' из во внутреннем цикле, не ясно - это, конечно, не из' range() '. Устранение этого вопроса позволило бы дать более окончательный ответ. – kampu
ТипError, который вы получаете, заключается в том, что Python пытается выполнить итерацию через один int, чтобы присвоить значения двум именам. Это было названо «распаковкой кортежа» и является частью того, почему «a», «b», «a» является действительным Python для замены имен. – pcurry