Как отмечали другие, использование здесь ключевого слова global
не является хорошей практикой. Вместо этого не включайте в него список proteins
и расширяйте его за пределы функции.
Я бы также избегал конкатенации отдельных символов, но собирал только смещения букв «M» и использовал те, чтобы разрезать строки, как только вы дойдете до завершающего "_".
Вот как это будет выглядеть:
def prot_from_rf(aa_seq):
result = []
starts = []
for i, ch in enumerate(aa_seq):
if ch == "_":
result.extend([aa_seq[m:i] for m in starts])
starts = []
elif ch == "M":
starts.append(i)
return result
Вызовите как:
proteins = []
# ...
proteins.extend(prot_from_rf("NMNQT_CLI_VVMQLSMPHLYR_WISTCVNAMSS"))
print(proteins)
Предыдущий ответ
Раньше мне оставалось неясным, действительно ли ваш код правильно справлялся с ситуацией, когда перед появлением «_» встречается несколько символов «M».
Если бы предполагаемое поведение было что вторая буква "M" фактически завершает последовательность (если она продолжалась) и немедленно запускает следующую, тогда вы можете использовать регулярное выражение.
import re
def prot_from_rf(aa_seq):
return re.findall(r"M[^M_]*", aa_seq)
# Example use:
proteins = []
# ...
proteins.extend(prot_from_rf("MNQT_CLI_VVQLSPHLYRWISTCVNASSRRRPKRKIPCTQSPRELYTD"))
print(proteins)