#pragma css /css/2013.css <<BI>> = Практикум 7. Задания = ''Результатом этого задания является два скрипта на языке Python, в которых реализован перечисленный в заданиях 1 и 2 функционал, и файл с последовательностями `<Familiya>_pr7_proteins.fasta`, где `<Familiya>`, как обычно, Ваша фамилия. Скрипты и fasta-файл должны быть положены в папку зачетных заданий '''до 23:59''' дня накануне следующего занятия''.<<BR>> '''Внимание!''' Как и раньше, имя скрипта должны быть в том же формате, что и названия протоколов. Поскольку от Вас требуется два файла, в конце имени (до расширения!) после знака подчеркивания проставляйте номер (scrNN, где scr - сокращение от английского слова script, а NN - двухзначный порядковый номер скрипта). Например, Dibrova_pr7_scr01.py и Dibrova_pr7_scr02.py. ''Не забывайте смотреть [[../python_hints_DD|подсказки по python]], в которые добавлены пояснения по тем разделам, которые введены на этом занятии. В презентации тоже есть много примеров. И не стесняйтесь спрашивать преподавателей, если что-то не получается!'' {{{#!wiki warning Акция "'''Ошибайтесь и получайте бонусные баллы!'''" продолжается! Как? Посмотрите необязательное задание №4 уже сейчас! :) Также бонусные баллы начисляются за правильное название функций и переменных; за комментарии в теле скрипта и за комментирование функций. }}} = Обязательные задания = == Задание 1. Создайте скрипт, задающий класс, который описывает какой-нибудь объект в мире == Этот скрипт должен называться `<Familiya>_pr7_scr01.py`, где `<Familiya>` – Ваша фамилия в том же написании, что и раньше. '''Цель:''' выберите любой предмет реального (или фантастического) мира и создайте класс, который будет описывать такие предметы (частично описывать, конечно) в скрипте. Требования: * Имя класса должно быть названием данного предмета на английском языке (не на транслите). Пользуйтесь словарями или спросите у преподавателя, как называется этот предмет по-английски. * Если класс описывает предметы из фантастического мира, то обязательно создайте комментарий в скрипте, объясняющий что это за зверь такой :) * В классе должно быть минимум 3 переменных-члена (атрибута) и минимум 2 функции-члена (метода). * Помимо этих двух функций-членов, в классе должна быть инициализирующая функция. '''После задания класса убедитесь, что он работает.''' Для этого: 1. Создайте четыре экземпляра класса с разными атрибутами; 1. Поместите эти экземпляры в список; 1. Пройдите по списку и заставьте каждый экземпляр вызывать свои методы; проверьте, что получается. == Задание 2. Напишите скрипт, читающий файл в формате fasta с несколькими последовательностями и печатающий эти последовательности на экран == Этот скрипт должен называться `<Familiya>_pr7_scr02.py`, где `<Familiya>` – Ваша фамилия в том же написании, что и раньше. '''Цель:''' создайте скрипт, умеющий читать fasta-файл и сохранять в память информацию о последовательностях нескольких белков, содержащихся в прочитанном файле. === 2.1. Подготовка fasta-файла с несколькими последовательностями === Примечание: если в одном файле сохранены несколько последовательностей, каждая из которых имеет формат fasta, и не содержится никакой другой информации (кроме пустых строк) -- то такой файл тоже считается файлом в формате fasta. Например: {{{ >protein1 My good protein MTSKLLVSTFGGTRYH THGYF >protein2 The best protein! [user1] MHGTSDERFRYH GTRY FGTRG >protein3 The very best protein!! [user2] MAAAAFRTYING }}} Составьте файл, включающий последовательность Вашего белка и последовательности белков трех других студентов, выбранных случайным образом и приведенных в [[../table_b2_pr7|таблице 1]]. В этой таблице в соответствующей Вам строке приведены ники тех студентов, чьи белки Вам необходимо взять. Чтобы это сделать: 1. Создайте новый файл, назовите его `<Familiya>_pr7_proteins.fasta`, где `<Familiya>` - Ваша фамилия. 1. Скопируйте в него последовательность Вашего белка в fasta-формате (то есть вместе со строкой ">name Description"). 1. Войдите на сервер kodomo через NetBox, так же, как входили на сервера NCBI (или как входите обычно из дома), указав: * `File protocol`: '''SCP''', * `Host name`: '''kodomo.fbb.msu.ru''', * `Login type`: '''Normal''', * логин и пароль -- Ваши обычные. 1. Перейдите в родительскую директорию по отношению к Вашей домашней. Там Вы увидите список ников студентов. 1. Зайдите в директории `term1/block1/credits/` тех студентов, которые даны Вам в таблице, и cкопируйте последовательности их белков в fasta-формате в файл, созданный в пункте 1. '''Добавьте в конец описания каждой скопированной последовательности через пробел в квадратных скобках ник того студента, у которого она взята.''' 1. Если нужного файла у кого-то из Ваших коллег нет, то выберите себе любого другого студента. === 2.2. Написание скрипта === При выполнении данного задания приветствуется использование перекомпонованных функций из предыдущего практикума: не зря же Вы их писали! Примерный алгоритм, которым можно решить эту задачу, приведен в [[../hints_b2_pr7|советах]] по этому заданию. Следовать ему, разумеется, не обязательно; можете придумать и свой вариант! Скрипт должен делать следующее: 1. Задавать новый класс `Protein`, описывающий один белок. В [[../python_hints_DD#A8|справочной информации по классам]] рассказывается с примерами о том, как задать класс, его атрибуты и методы. Этот класс должен содержать: * атрибуты, хранящие идентификатор (`id_RefSeq`), описание (`description`) и последовательность (`sequence`) белка; * инициализирующий метод (в [[../python_hints_DD#A8.4|этом разделе]] справки по Python находится объяснение того, что это такое и как его задать); * метод, позволяющий напечатать на экран информацию о данном белке в формате fasta с заданным числом букв в строке последовательности. 1. Открывать Ваш файл `<Familiya>_pr7_proteins.fasta`, где `<Familiya>` - Ваша фамилия (конкретное имя задайте в одной из переменных в теле скрипта), и обрабатывать его построчно. Про то, как это сделать, читайте в [[../python_hints_DD#A4.4|этом разделе]] справки по Python. 1. Сохранять информацию о последовательностях в '''список объектов класса, заданного в начале скрипта'''. Про списки и строки вообще читайте [[../python_hints_DD#A6|тут]], про методы, связанные со строками, -- [[../python_hints_DD#A9.4|тут]], а про методы, связанные со списками, -- [[../python_hints_DD#A9.5|тут]]. 1. Проходить по списку белков и вызывать их методы, печатающие информацию в fasta-формате на экран с любой выбранной Вами длиной строки последовательности. = Необязательные задания (на дополнительные баллы) = == Задание 3*. Получение параметров скрипта из командной строки == Пользуясь [[../python_hints_DD#A4.7|справочной информацией]], сделайте так, чтобы скрипт получал имя fasta-файла и количество букв, которые нужно выводить на экран, из командной строки. * Скрипт должен получать из командной строки два аргумента: первый -- имя файла, который будет читаться, второй -- количество букв в строке при распечатке последовательностей в fasta-формате; * Проверять, что получено два аргумента: если их получено меньше или больше, скрипт должен выдать на экран текст, сообщающий пользователю, какие аргументы требуется ввести, и завершить работу. В [[../python_hints_DD#A4.8|разделе подсказок 4.8]] написано, как можно завершить работу своего скрипта с помощью команды. == Задание 4*. Коллекционер и победитель ошибок (продолжение) == Соберите коллекцию ошибок Вашего скрипта, с которыми Вы столкнулись в процессе работы. Предоставьте в папке `credits` второго блока протокол с обычным именем (например, `Dibrova_pr7.doc`), в котором будет приведена следующая информация об ошибках. Протокол оформите в удобном для Вас формате, но чтобы было понятно, что происходит. Про каждый случай укажите: 1. Ошибка, выданная Python (чтобы получить текст ошибки в текстовый файл, а не просто на экран, воспользуйтесь [[../hints_b2_pr5|подсказками к занятию 5]]). 1. Место в скрипте, вызвавшее ошибку (та строчка или строчки, из-за которых все пошло наперекосяк). 1. Объяснение, что именно неверно. 1. Исправленная, работающая версия. P.S. Ошибки в протоколах за практикумы 5, 6 и 7 не должны повторяться. Задание называется "Коллекционер и победитель ошибок", а не "Любитель гулять по граблям" :)