Учебная страница курса биоинформатики,
год поступления 2015
Начиная с этого практикума, будет проверяться не только корректность работы программы, но и его соответствие рекомендациям PEP8 (см. также оригинальный английский текст). Для зачёта соблюдение стандарта не обязательно, но баллы за плохой код могут быть снижены до минимума.
Практикум 9. Функции и модули. Задания
(*) — дополнительное задание
Всем заданиям присвоены мнемоники, указанные после названий. Мнемоники заданий подчеркнуты.
Внимание: поскольку некоторые задания подразумевают многомодульные программы, решения каждой задачи кладите в отдельную папку ~/term1/block3/credits/Lastname_pr9_mnemonics. При этом основная программа должна быть в файле ~/term1/block3/credits/Lastname_pr9_mnemonics/Lastname_pr9_mnemonics.py , а файл(ы) с функциями могут называться произвольно (но без использования пробелов, кириллицы, заглавных букв!). Разумеется, при импорте модуля в основную программу его имя должно совпадать с именем соответствующего файла без расширения.
Прошлогодняя памятка частично покрывает материал занятия.
Во всех заданиях входные параметры получайте из командной строки.
1. Тригонометрия. Мнемоника: trigonometry
Программа принимает угол в градусах и печатает его синус и косинус с четырьмя знаками после запятой. Значение угла может быть любым вещественным числом.
Пример входа:
python Pupkine_pr11_trigonometry.py 90
Пример выхода:
1.0000 0.0000
Подключите модуль math. С помощью dir и help узнайте, как переводить из градусов в радианы и как вызывается синус и косинус.
2. Приближённое вычисление производной синуса. Мнемоника: der-sin Программа принимает на вход число x и шаг d (то и другое — в радианах) и вычисляет производную синуса по приближённой формуле:
f'(x) ≈ (f(x + d) - f(x - d))/2d
(в данном случае f(x) = sin x), после чего печатает в одну строку через табулятор четыре числа: x, производную, вычисленную по приближённой формуле, настоящую производную и модуль разности между настоящей и приближённой производной. Каждое число печатайте с 4 знаками после запятой.
Указания
байт "табулятор" вводится в строку выражением \t, например:
print str(a) + "\t" + str(b)
напечатает значения переменных a и b, разделённые табулятором.
если ml — список, состоящий только из строк, то выражение "\t".join(ml) возвращает строку из элементов списка, "склееных" табулятором (попробуйте!)
если переменная a имеет тип float, то выражение "{:.3f}".format(a) имеет значение строки, выражающей a с тремя знаками после десятичной точки.
2a (* – дополнительно, результат описывайте в протоколе Lastname_pr9.doc) какое d надо взять, чтобы приближённое значение производной для любого x отличалось от истинного меньше, чем на одну тысячную?
2b(* – дополнительно, результат там же): сравните точность вышеприведённой формулы и другой приближённой формулы для производной:
f'(x) ≈ (f(x + d) - f(x))/d
при одинаковых значениях x и d (не на одном примере, разумеется — нужно выявить тенденцию!)
2c (** – дополнительно, результат там же) то же, что 2b, но для других функций (логарифм, экспонента, квадратный корень, арктангенс), чьи производные вам известны.
3. Случайная последовательность. Мнемоника: randomdna
Для тестирования различных методов обработки биологических последовательностей часто применяют случайные последовательности. Самый простой способ создать случайную последовательность — это выбирать на каждую позицию последовательности случайную букву (одну из A, T, G, C) с равной вероятностью.
Программа принимает длину последовательности и создаёт файл randomseq.fasta, в который пишет случайную последовательность заданной длины с именем "random" и без описания (вспоминайте fasta-формат!).
Пример входа:
python Pupkine_pr11_randomdna.py 10
Пример выхода (содержимое файла randomseq.fasta):
>random CATCAGGGAC
Указания.
- Импортируйте модуль random, с помощью dir и help найдите метод, который возвращает случайный элемент списка.
Запись в файл — метод out.write(строка), где out — файл, открытый на запись (командой out = open(имя, "w"))
Перенос строки — \n в нужном месте строки.
4. Много случайных последовательностей. Мнемоника: randomdnamany
Программа принимает через аргументы командной строки число последовательностей, минимальную и максимальную длины последовательностей и создаёт файл randomseqs.fasta, в который пишет последовательности согласно пожеланиям пользователя. Длина последовательности выбирается случайным образом между минимальной и максимальной длиной включительно. Имена последовательностям присваивайте по своему усмотрению, но без повторов (иначе фаста-файл не будет корректным).
Пример входа:
python Pupkine_pr11_randomdna.py 2 10 20
Пример выхода (randomseqs.fasta):
>random-1 CATCAGGGACCGCA >random-2 GCAATGAATGCTCAC
Эта программа должна подключать написанный вами же модуль, в котором содержатся: (i) функция, получающая в качестве аргумента длину последовательности и возвращающая случайную последовательность указанной длины; (ii) функция, получающая номер последовательности (число) и возвращающая ее название для фаста-файла (строку).
5. Скачай файл. Мнемоника: urllib2
Программа принимает от пользователя URL и скачивает его содержимое. Также пользователь вводит фразу для поиска. Программа ищет фразу в содержимом страницы, которую она скачала. Если фраза нашлась, печатает YES, иначе печатает NO.
Пример входа:
python Pupkine_pr11_urllib2.py http://google.com google
Пример выхода:
YES
Указания.
- Импортируйте модуль urllib2, с помощью dir и help найдите нужный метод.
Дополнительные задания
* 6. Числа Фибоначчи. Мнемоника: 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
* 7. Поиск палиндромов. Мнемоника: 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
** 8. Игра НИМ. Мнемоника: nim
Ним — математическая игра, в которой два игрока по очереди берут предметы, разложенные на несколько кучек. За один ход может быть взято любое количество предметов (большее нуля) из одной кучки. Выигрывает игрок, взявший последний предмет.
Игра интересна тем, что для неё существует простая выигрышная стратегия. Кому интересно, могут над ней подумать, а для выполнения этого задания можно воспользоваться готовой стратегией.
Напишите программу, играющую с игроком в НИМ и выигрывающую всегда, когда это возможно.
Пользователь вводит начальные количества камней в кучках, разделяя их пробелами:
1 2 4
Число камней в каждой кучке должно быть натуральным.
Программа решает, будет ли она ходить первой или второй (в соответствии с выигрышной стратегией). Если решила, что будет ходить первой, то делает ход и печатает новое состояние игры:
1 2 3
Если программа решила ходить второй, то она перепечатывает исходное состояние игры.
Затем программа принимает ввод нового состояния игры от пользователя. Пустые кучки обозначаются числом 0. Если пользователь ошибся с вводом (ввёл что-то вместо списка чисел нужной длины или ввёл состояние игры, которое не может получиться в результате его хода), то программа должна напечатать фразу, включающую слово error и предложить пользователю переходить.
Так они и ходят, пока кто-то не возьмёт последний камень (и введёт список из нулей). После этого программа печатает, кто победил. Если победил пользователь (чего не должно происходить, если программа следует выигрышной стратегии), выдача программы в этом месте должна содержать слово you, а если победил компьютер, выдача должна содержать me.
Упражнения для самостоятельной работы.
Эти упражнения не проверяются. Они для того, чтобы помочь вам освоить новые понятия.