Учебная страница курса биоинформатики,
год поступления 2014
(*) - дополнительное задание
Всем заданиям присвоены мнемоники, указанные после названий. Мнемоники заданий подчеркнуты. Решение кладите в файл ~/term1/block3/credits/ВашаФамилия_практикум_мнемоника.py где ~ - ваша домашняя папка (не путать с папкой public_html!), ВашаФамилия - ваша фамилия латинскими буквами с большой буквы, а мнемоника - мнемоника, указанная в задании. Пример: ~/term1/block3/credits/Pupkine_pr11_fibonacci.py
Протокол ~/term1/block3/credits/Pupkine_pr11_protocol.txt нужен для ответов на дополнительные задания
Регистр букв в имени файла, как в задании. Не ошибайтесь с именем файла, иначе мы не увидим решение!
Обязательно приходите на следующее занятие (21 ноября)! Будут выдаваться индивидуальные зачётные задания
Практикум 11. Функции и модули. Задания
Памятка частично покрывает материал занятия.
Мы ведём обновляемый список типичных ошибок. Прочитайте, чтобы не повторять их в новом задании.
Если по условию задачи программа принимает или выдаёт не одно, а несколько значений, выдавайте их в том же порядке, в котором они упоминаются в условии (если в условии явно не прописано, что порядок значения не имеет), иначе система проверки может не принять решение.
Система самопроверки домашних заданий поможет самостоятельно проверить домашнее задание до сдачи. Внимание! Эта форма не запоминает результатов. Не забудьте в срок разместить файл в правильном месте.
Упражнения для самостоятельной работы.
Эти упражнения не проверяются. Они для того, чтобы помочь вам освоить новые понятия.
Во всех заданиях ниже входные параметры получайте из командной строки!
1. Тригонометрия. Мнемоника: trigonometry
Программа принимает угол в градусах через аргумент командной строки и печатает его синус и косинус. Значение угла может быть любым вещественным числом.
Пример входа:
python Pupkine_pr11_trigonometry.py 90
Пример выхода:
1 0
Подключите модуль math. С помощью help узнайте, как переводить из градусов в радианы и как вызывается синус и косинус.
2. Случайная последовательность. Мнемоника: randomdna
В прошлом задании было несколько заданий, в которых программе на вход подавалась некая последовательность. Для тестирования таких программ (не только учебных) часто применяют случайные последовательности. Самый простой способ создать случайную последовательность - это выбирать на каждую позицию последовательности случайную букву (одну из A, T, G, C).
Программа принимает через аргументы командной строки число последовательностей, минимальную и максимальную длины последовательностей и создаёт файл output.fasta, в который пишет последовательности согласно пожеланиям пользователя. Длина последовательности выбирается случайным образом между минимальной и максимальной длиной включительно. Имена последовательностям присваивайте по своему усмотрению, но без повторов (иначе фаста-файл не будет корректным).
Пример входа:
python Pupkine_pr11_randomdna.py 2 10 20
Пример выхода (output.fasta):
>test1 CATCAGGGACCGCA >test2 GCAATGAATGCTCAC
В этой программе создайте и используйте (i) функцию, получающую на вход длину последовательности и возвращающую случайную последовательность указанной длины; (ii) функцию, получающую номер последовательности и возвращающую ее название для фаста-файла.
Импортируйте модуль random, с помощью help найдите метод, который возвращает случайный элемент списка.
3. Скачай файл. Мнемоника: urllib2
Программа принимает от пользователя URL и скачивает его содержимое. Также пользователь вводит фразу для поиска. Программа ищет фразу в содержимом страницы, которое она скачала. Если фраза нашлась, печатает YES, иначе печатает NO.
Пример входа:
python Pupkine_pr11_urllib2.py http://google.com google
Пример выхода:
YES
4. Трансляция в определенной рамке. Мнемоника: translation-in-frame-argv
Через аргументы командной строки программа получает имя файла с единственной нуклеотидной последовательностью в формате fasta; рамку считывания (0, 1, или 2), в которой ищутся открытые рамки; минимальную длину белка в аминокислотных остатках; имя выходного файла. Программа находит максимальные по длине открытые рамки в данной рамке считывания, транслирует каждую, и если она подходящей длины, то записывает в выходной файл в формате fasta. ("Максимальные по длине" - значит если есть несколько альтернативных старт-кодонов, выбирать первый, чтобы открытая рамка получилась длиннее.) К имени последовательности добавляется _protein_i где i - номер выводимой аминокислотной последовательности для данной нуклеотидной последовательности, начиная с 1. Последовательности выходного FASTA-файла не должны содержать описания.
Если входной файл не содержит ни одной открытой рамки, то после работы программы выходной файл должен быть пустым.
Открытая рамка начинается со старт-кодона ATG и завершается одним из стоп-кодонов (TGA, TAA, TAG). Если у открытой рамки существует несколько альтернативных старт-кодонов (пример: CATGССCATGCCC), то программа должна выбрать ту из них, длина которой больше.
Стоп-кодон отмечается в выходе "*", но не входит в учёт длины белка. Если открытая рамка обрывается без стоп-кодона, то такая открытая рамка отбрасывается (и открытой рамкой не считается, если уж об этом зашла речь).
Пусть пользователь выбрал сканирование в рамке 1 и минимальный размер белка 5. Имя входного файла: mydna.fasta. Имя выходного файла: myprotein.fasta.
Пример входа:
python Pupkine_pr11_translation-in-frame.py mydna.fasta 1 5 myprotein.fasta
Входной файл mydna.fasta (имя файла передаётся через аргументы командной строки):
>I46D GATGCCTCAGGAACACGTTTTCCCTTTGGAACTTACGTCTGTCCGGGATCATATCAGCTA GCCCCAAAATTTTTGGAAC
Входной файл myprotein.fasta (имя файла передаётся через аргументы командной строки):
>I46D_protein_1 MPQEHVFPLELTSVRDHIS*
Правильный стиль написания кода состоит в том, что пишется несколько функций, выполняющих отдельные простые операции. Головная программа состоит из разбора входных параметров и обращения к нескольким функциям.
Один из вариантов организации данной программы примерно такой.
Функция 1 получает на вход последовательность и сдвиг рамки 0, 1 или 2 (ещё это число называют фазой рамки). Возвращает последовательность в этой рамке (для этого нужно удалить несколько букв с начала последовательности, сколько - зависит от сдвига рамки).
Функция 2 получает на вход последовательность и возвращает подпоследовательность, начинающуюся с первого ATG в рамке 0 и до конца.
Функция 3 получает последовательность, начинающуюся с ATG, находит ближайший стоп-кодон в 0-й рамке и возвращает две подпоследовательности: от начала до стоп-кодона вкл. - кодирующую последовательность, - и от следующего кодона до конца. Если стоп-кодона нет, то возвращает специальное значение. В качестве такого часто используют системную константу None. Узнайте/спросите как возвратить сразу две переменных.
Функция 4 получает кодирующую последовательность и транслирует нуклеотидную последовательность от первого до последнего её. Возвращает последовательность белка.
Функция 5 по номеру и имени нуклеотидной последовательности формирует имя последовательности белка.
Функция 6 получает объект типа файл на запись, белковую последовательность и имя последовательности, добавляет в файл две строчки с последовательностью в формате fasta.
Дополнительные задания
* 5. Числа Фибоначчи. Мнемоника: fibonacci
Числа Фибоначчи - элементы бесконечной числовой последовательности
- 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, ...
в которой каждое последующее число равно сумме двух предыдущих чисел.
Договоримся нумеровать элементы последовательности с нуля. Таким образом, нулевой элемент последовательности равен 0, первый: 1, второй: 1 = 0 + 1, третий: 2 = 1 + 1 и т.д.
Программа принимает число N через аргументы командной строки и создаёт список членов последовательности Фибоначчи с индексами от 0 до N включительно. Таким образом, в писке будет N+1 элементов.
Полученный список программа выводит через пробел (print).
Пример входа:
python Pupkine_pr11_fibonacci.py 6
Пример выхода:
0 1 1 2 3 5 8
* 6. Поиск палиндромомов. Мнемоника: find-selfcomplement
Через аргументы командной строки программа получает имя фаста-файла и название последовательности, с которой она в дальнейшем и работает. Кроме того, программа получает имя выходного фаста-файла (третий аргумент командной строки).
Найти максимальные по длине подстроки в составе данной последовательности, представляющие собой палиндромомы. Минимальная длина найденного палиндромома равна 4. Если один палиндромом входит в другой (младший палиндром может быть расположен при этом не обязательно по центру старшего палиндрома), то выводить нужно только более длинный.
(*) Подумайте, почему ДНК-палиндромы всегда четной длины. Ответ в протокол.
Найденные палиндромомы в любом порядке записываются в выходной файл. Имена последовательностей произвольные, но не должны повторяться. Не обращайте внимание на имена последовательностей, которые проверяющая система присваивает в ожидаемом выходе. В выходном файле не должно быть повторяющихся последовательностей.
Пример входа:
python Pupkine_pr11_find-selfcomplement.py mydna.fasta test2 mypalindromes.fasta
Входной файл mydna.fasta (имя файла передаётся через аргументы командной строки):
>test1 description 1 TTTGCACA >test2 description 2 GTTTAAAGGG >test3 description 3 TAAT
Входной файл mypalindromes.fasta (имя файла передаётся через аргументы командной строки):
>sc1 TTTAAA
** 7. Игра НИМ. Мнемоника: nim
Ним — математическая игра, в которой два игрока по очереди берут предметы, разложенные на несколько кучек. За один ход может быть взято любое количество предметов (большее нуля) из одной кучки. Выигрывает игрок, взявший последний предмет.
Игра интересна тем, что для неё существует простая выигрышная стратегия. Кому интересно, могут над ней подумать, а для выполнения этого задания можно воспользоваться готовой стратегией.
Напишите программу, играющую с игроком в НИМ и выигрывающую всегда, когда это возможно.
Пользователь вводит начальные количества камней в кучках, разделяя их пробелами:
1 2 4
Число камней в каждой кучке должно быть натуральным.
Программа решает, будет ли она ходить первой или второй (в соответствии с выигрышной стратегией). Если решила, что будет ходить первой, то делает ход и печатает новое состояние игры:
1 2 3
Если программа решила ходить второй, то она перепечатывает исходное состояние игры.
Затем программа принимает ввод нового состояния игры от пользователя. Пустые кучки обозначаются числом 0. Если пользователт ошибся с вводом (ввёл что-то вместо списка чисел нужной длины или ввёл состояние игры, которое не может получиться в результате его хода), то программа должна напечатать фразу, включающую слово error и предложить пользователю переходить.
Так они и ходят, пока кто-то не возьмёт последний камень (и введёт список из нулей). После этого программа печатает, кто победил. Если победил пользователь (чего не должно происходить, если программа следует выигрышной стратегии), выдача программы в этом месте должна содержать слово you, а если победил компьютер, выдача должна содержать me.