Учебная страница курса биоинформатики,
год поступления 2018
1. Пурин или пиримидин
Нужно овладеть
- (1) приёмом получения входных данных из командной строки
- (2) функцией len()
- (3) методами строки, в частности, заменой всех строчных букв строки на заглавные
- (4)(уже было) конструкцией if
- else
- (5)правильно также овладеть словарем (хотя можно решить задачу и без него)
(1) пользователь вводит данные в строке с обращением к программе так:
python3.6 pr8_nucleobase G
и ждет ответа. "G" считается первым аргументом из командной строки (нулевой - имя программы, после пробела можно добавлять второй и др. аргументы)
Программа узнаёт про аргументы так. В начале программы пишем:
import(sys) # загружается модуль (файл) sys # с функциями,расширяющими возможности python # В частности,список sys.argv содержит все аргументы # командной строки согласно их порядку в командной строке; разделитель - пробел letter = sys.argv[1] # переменная letter содержит в примере # строку из одной буквы "G"
(2) догадайтесь каковы ответы: print(len("ABCD")) print(len([1,2,3,0,-1])
len() пригодится для проверки корректности входных данных
(3) методы строки можно узнать так
python3.6 Запускается python как калькулятор >>>help(str) Появляется список методов строки. Те, которые имеют вид __xxxxx__, пропустите, такие - не для людей :). Ниже них перечислены методы для людей, с описаниями.
Пример, метод строки isdecimal(). Возвращет True, если все символы - цифры. Методы применяются так:
>>>m = "123" 123 >>>m.isdecimal() True >>>h = "a125,1" a125,1 >>>h.isdecimal(h) False
Найдите нужный метод и примените его, чтобы вместо буквы "a" получить букву "A"
(5) Вот так можно создать словарь:
nucls = { "A":"purine", "C":"pyrimidine", "G":"purine","T":"pyrimidine"}
До двоеточия - ключ словаря. Обязан быть неизменяемым (например,не может быть списком). После двоеточия - значение, может быть данными любого типа
Вот что можно делать, и что вы можете использовать в этой программе
>>> nucls["C"] pyrimidine >>> "N" in nucleotides False >>> "G" in nucleotides True
2. Среднее по больнице
Нужно владеть
- читать файл с данным именем по строкам. Пример. читаем файл my_data.txt
f = open("my_data.txt",'r') # 'r' - от read, читать; можно опустить 'r', # так как по умолчанию подразумевается # открыть для чтения # открытие резервирует этот файл на диске чтобы # избежать конфликтов с другими программами, # которые вдруг захотят работать # именно с этим файлом. # f - переменная типа file; методы файла см. ниже for x in f: # цикл for позволяет читать файл строка за строкой; print(x) # выглядит так, как будто мы перебирам элементы из # списка строк файла. #На печати появятся все строки файла, одна за одной. f.close() # Сообщили, операционной системе что этот файл мы # больше не используем
# можно прочесть файл иначе
f = open("my_data.txt") lines = f.readlines() # lines в точности, список строк файла! f.close() # преимущество: можно прочитать любую строку, не по # порядку; например, прочитать строку # lines[125] или посчитать число строк len(lines) for x in lines: # недостаток: файл может быть очень большим и print(x) # не поместиться в память компьютера
- переводом строк вида "123" или "-12.5" в числа (float("123") = 123.0, int("123") = 123 )
- уметь создать счётчик введенных строк файла (до цикла вводим переменную "счётчик" i = 0, после получения очередной строки прибавляем 1: i += 1 )
знать что такое среднее
8.Медиана
Нужно владеть
- Тем же, что в задании 2, см. выше
- получить список десятичных чисел (назовем его для примеры decimals) прочтенных из файла. Пусть decimals = [10.0, 20.0, 30.0, 3.142]
- Вычислить длину списка n
- упорядочить список по возрастанию; без этого - не найти медиану!
- делается либо методом списка .sort() (читайте help(list.sort) ). Важно, что результат - упорядочение самого списка (IN PLACE), а не другой список!
- либо функцией sorted(decimals); здесь оба варианта возможны:
- sorted(decimals) сортирует сам список decimals (IN PLACE)
- sorted_decimals = sorted(decimals) - sorted_decimals равен упорядоченному списку decimals, а сам decimals остается как был
- при вычислении медианы по упорядоченному списку ориентируйтесь на картинку по ссылке в задании.
3. Простое число
Нужно владеть
- приёмом получения входных данных по запросу (input)
- методами строки, в частности, методом .isdecimal() - проверка того, что строка содержит только цифры, другие символы не допускаются! См. также в подсказке к заданию 1.
- Угадайте ответы и проверьте угадали ли:
>>>"123".isdecimal() >>>"-1".isdecimal() >>>"0".isdecimal() >>>5.isdecimal()
- возможностями перебора с помощью range(). Чтобы избежать непонятных слов напишем так
>>> a = list(range(2,10))) # a - список значений, перебираемых # "итератором" range. list() - функция, переводящая # аргумент в список, (если это возможно) # (слово итератор понимать не обязательно) >>> a [2,3,4,5,6,7,8,9]
Важно, 2 - первое значение, берутрся все значения меньше 10 c шагом 1 по умолчанию; можно указать шаг третьим параметром
- циклом по списку:
for n in range(2,10): ..... #проверка делит ли n данное число ..... if .... : print(....) exit() # прекращение работы программы print(...)
- делением целых: 4/5 и 4//5, проверкой делимости нацело (надо сообразить как)
4. Сложение чисел
Нужно овладеть умениями
- циклом while (в задаче - пока введенная строка не равна "end")
5. Имена последовательностей
Нужно овладеть умениями
- читать файл с данным именем по строкам. Пример. читаем файл my_sequences.fasta по строкам. См.подсказки к заданию 2.
- проверка первого символа line[0] в очередной строке(я её назвал line) из файла
- анализ строки line[1:]. Метод строки strip() - оголять - убирать конца строки, пробелы и прочие невидимые символы с обоих концов строки; split() - разделить строку на слова и положить слова в список. Здесь делить надо один раз, т.к.первое слово - имя последовательности, все остальные вместе - описание последовательности. Это делается так:
>>>s = " abc defg hklm " abc defg hklm >>> s1 = s.strip() "abc defg hklm" >>> s.strip().split(None, 1)# None - деление по пробелам, табуляторам и др. ["abc","defg hklm"] #невидимым символам (они называются "white symbols") # 1 что делить надо только первый раз
- Запись в файл делается так:
g = open("sequence_names.txt",'w')# создали файл,открыли файл на запись #(т.к. 'w' - от write g.write(stroka + "\n") # "\n" - символ конца строки; если его не # добавить, то следующая строка запишется в # в ту же строку файла # в этой задаче stroka = name + "\t" + # description # строки имя последовательности name и # описание последовательности description вы # получите при построчном чтении входного # файла формата fasta, наткнувшись на # строку с названием очередной # последовательности, т.е. символом ">" в # первой позиции строки g.close() # Если что-то открыли, то будьте любезны # закрыть уходя :)
- для дополнительных баллов думайте сами; вычислить длины последовательностей очень не просто. Лучше и не делайте этого, зря я даю это усложнение. ААл
6. Кодирующие последовательности
Нужно овладеть навыками:
- определить номер колонки, c которой записано слово CDS в файле формата .gbk
- чтение файла построчно, см выше подсказки к заданию 2
- срез строки ( line(2:5)- строка из трех символов - 3го,4го,5го по порядку из строки line
- создание счётчика строк CDS, см выше подсказки к заданию 2
- для дополнительных баллов: в строке с CDS указаны начало и конец кодирующей последовательности; подумайте как их добыть из строки
7. Эволюция как последовательность ошибок
Нужны навыки
- прочесть два файла в две строки, например seq1 и seq2
- проверить, что они одинаковой длины, обозначим её n
- параллельно читать по букве из двух строк; для этого можно использовать список range(n)(Он равен [0,1,...,n]) в цикле for i in range(n): читать по букве из каждой строки и сравнивать их
Проверку того, что строка в d = "-1.1" - представляет из себя число можно сделать так. 1) проверить, что d[0] in ["+","-"]; 2) заменить в строке d[1:] (она равна "1.1") точку на пустой символ (метод строки .replace(), читайте help; пустой символ "") 3) Проверить, что получившаяся строка "11" содержит только цифры - метод строки .isdecimal().
Есть другой способ: написать int(d) и перехватить сообщение об ошибке с помощью
try:
except:
Но об этом на следующих занятиях.