Kodomo

Пользователь

Учебная страница курса биоинформатики,
год поступления 2013

Практикум 6. Задания

Результатом этого задания является скрипт на языке Python, в котором реализованы перечисленные в заданиях 1 и 2 функциональности. Скрипт должен быть положен в папку зачетных заданий до 23:59 дня накануне следующего занятия.

Внимание! Как и раньше, имя скрипта должны быть в том же формате, что и названия протоколов. Сейчас требуется один скрипт, поэтому порядковый номер указывать не нужно. Например, ДД должна назвать свой скрипт так: Dibrova_pr6.py.

Не забывайте смотреть подсказки по python, в которые добавлены пояснения по тем разделам, которые введены на этом занятии (а также к некоторым разделам, которые есть в презентации, но на которые не хватило времени при объяснении). В презентации тоже есть много примеров. И не стесняйтесь спрашивать любого из преподавателей, если что-то не получается!

Акция "Ошибайтесь и получайте бонусные баллы!" продолжается! Как? Посмотрите необязательное задание №4 уже сейчас! :)

1. Начиная с этого раза, мы перестаем указывать на необходимость каждый раз создавать новую рабочую директорию и прочие стандартные технические вещи. Предполагается, что уже выработалась привычка делать это по умолчанию!
2. Приведенные в начале тренировочные задания не являются обязательными для зачета, но их очень рекомендуется попробовать сделать по возможности на занятии, чтобы сразу спросить преподавателя о трудностях. Умение выполнить их все - ключ к выполнению обязательного задания! Разбитый на отдельные блоки, составной ключ.
3. Советуем тренировочные задания делать в одном или нескольких вспомогательных скриптах, а НЕ В КОНСОЛИ Python, чтобы можно было сохранить результат и потом при выполнении домашнего задания быстро освежить в памяти.

Тренировочные задания

Задание 0. Тренировка отдельных навыков, нужных для выполнения основного задания

  1. Логические операторы и операторы сравнения, условия, цикл while

    • Задайте несколько булевых переменных, которые получаются путем комбинации операторов сравнения (>, < и т.п.) и логических операторов (and, or, not). Угадайте, чему будет равен результат каждой, а потом выведите их на экран. Если получаются какие-то неожиданности, опишите их в протоколе практикума или сразу спросите у преподавателя.

    • Попробуйте в зависимости от того, верна или нет какая-то из Ваших булевых переменных, напечатать на экране разные строки текста.
    • (чуть сложнее) Попробуйте использовать цикл while для того, чтобы вывести на экран значения числа в заданных Вами пределах (с определенным шагом) и его квадрата. Перенаправьте результат в файл, посмотрите, что получилось.

  2. Задание кортежа и списка вручную и манипуляции с их элементами

    • Задайте кортеж, состоящий из двух чисел, какой-нибудь строки и булевой переменной со значением "ложь". Попробуйте вывести на экран кортеж целиком (print fooname), а также попробуйте напечатать элементы кортежа с номерами 0, 3 и 10.

    • Попробуйте изменить первое значение кортежа на другое, не создавая новый кортеж, и вывести весь кортеж на экран. Что получилось?
    • Задайте список, состоящий из тех же величин. Повторите с ним те же манипуляции. Что получилось?
  3. Задание кортежа и списка в автоматическом режиме и манипуляции со всеми элементами через цикл for

    • Задайте переменную num, содержащую положительное целое число. Создайте список, хранящий числа от 0 до num. Выведите список на экран; проверьте, что последнее число – действительно num. Создайте другую переменную, в которой сохраните длину списка. Чему равно ее значение?

    • Сделайте то же самое для переменной neg_num, в которой сохраните отрицательное целое число. Что получилось?

    • Попробуйте функции range() подать на вход не одно значение, а два. Что будет, если первое меньше второго? Что будет, если второе меньше первого?

  4. Исследование того, какими символами разделяются строки в текстовом файле

    • Создайте в рабочей директории текстовый файл из двух коротких слов на английском, но написанных на разных строках. Сохраните его. Откройте файл в режиме просмотра HEX-кодировки (откройте файл в режиме просмотра в Far Manager, т.е. не клавишей F4, а клавишей F3, и переключитесь с помощью горячей клавиши F4 из режима "Text" в режим "HEX").

    • Обратите внимание на правую часть окна: оба слова оказались слеплены, но разделены парой странных символов (у меня отображается символ нотки и закрашенный квадратик с окружностью). В левой части окна посмотрите, каким шестнадцатеричным числом кодируется каждый из этих символов?
      • Замечание: первый из этих символов ("нотка") является своеобразным "динозавром", который есть в Windows, но отсутствует в Unix-подобных операционных системах (например, в Linux, с которым Вы будете работать достаточно скоро). Этот символ называется возвратом каретки и в программировании обозначается \r (символ \ является служебным - он указывает на то, что речь идет не о букве r, а о специальном символе возврат каретки). Второй символ – это собственно символ перевода строки, и он обозначается \n. Итого, в Windows перевод строки кодируется двумя символами, что периодически вызывает разные конфузы, а в Linux - одним.

    • Попробуйте сохранить файл в формате операционной системы Unix. Для этого откройте его для редактирования и нажмите <Shift + F2> ("Save As..."). В нижней части окна ("Change line breaks to:" выберите "Unix format") и смените имя файла. Откройте новый файл в режиме просмотра HEX-кодировки. Что изменилось?

  5. Проход по всем символам строки вручную

    • Задайте свою собственную функцию, которая получает на вход строчку, перебирает все символы этой строки и избавляется от всех символов \r и \n. Вариант алгоритма: создать в теле функции новую строку, в которую будут копироваться все символы кроме этих двух, а потом строку вернуть.

    • Разумеется, для этого существует уже написанная функция :) Не используйте ее сейчас, если даже знаете, попробуйте написать простенький алгоритм, чтобы проверить себя.

  6. Чтение текстового файла построчно и сохранение информации

    • Создайте в рабочей директории текстовый файл, содержащий несколько (штуки 3-4) разных строк с английскими символами. Сохраните его.
    • Откройте файл для чтения в своем скрипте, присвоив любой переменной результат вызова функции open() с именем созданного файла как аргументом.

    • Проверьте тип получившейся переменной с помощью функции type()

    • Создайте другую переменную, в которой сохраните все строки файла в виде списка. Это можно сделать с помощью функции list(), если подать ей на вход переменную типа file.

    • Выведите получившийся список на экран целиком командой print. Что получилось?
    • Сохраните все строчки файла в виде одной длинной строки. Для этого задайте сперва пустую строковую переменную (например, так: long_string = ""). Потом используйте цикл for, пройдите по всем строчкам файла. Используя написанную в п. 5 функцию, отрезайте от каждой строчки символ конца строки. После этого с помощью оператора + дописывайте к строке long_string результат.

Обязательные задания

Обратите внимание: задание 1 написано в двух редакциях (ААл и ДД). В них требуется сделать одно и то же, но способ объяснения того, что надо, разный :) Выберите тот, который покажется Вам более близким!

Задание 1 (редакция ААл). Создать скрипт, который вычисляет длину последовательности из файла в fasta-формате и выводит результат в поток выхода (на экран монитора).

>test_protein Hypothetical protein
MTSKLLVSTFGW
QErtK

line = line.strip(), где line – переменная, содержащая строку символов. Незначащие символы - пробелы, символы конца строки, символы табуляции и т.п. - называются 'white space'.

if len(line)==0:
    continue

line_list = line.split()

Замечания.

  1. Метод - это функция, которую можно применить к объекту данного типа. Например, к переменной типа int можно применить метод "прибавить другое число". Это можно записать так:

x = 2
x.__add__(2)

Задание 1 (редакция ДД). Чтение файла в fasta-формате.

Напишите скрипт, который сохраняет в памяти информацию из файла в fasta-формате, рассчитывает длину последовательности и выводит ее на экран. Скрипт должен делать следующее:

  1. содержать заданную переменную с именем файла в fasta-формате, который надо прочитать (например, filename = "Dibrova_YP0000001.fasta")

  2. читать заданный файл с последовательностью белка в fasta-формате и создавать три переменные:
    • переменную с идентификатором последовательности;
    • переменную с описанием последовательности;
    • переменную с самой последовательностью, сохраненной в виде одной строки, без символов пробела, конца строки (\n или \r).

  3. вычислять и выводить на экран длину последовательности (нуклеотидов или аминокислот). Важно: не просто длину, а строчку, где написано какая величина посчитана и выведена.

! Опробуйте такой алгоритм разбора первой строки. Как разделить первую строку на идентификатор и описание? Во-первых, нужно пропустить самый первый символ: это знак >, который в идентификатор не входит. Затем нужно в одну переменную записать все до первого пробела, а в другую - все после него. Значит, разумно создать булеву переменную, с именем, например, space_found и задать ей начальное значение True. Пока пробела не найдено (т.е. выполняется условие space_found == False), перебирайте символы строки из файла по очереди (начиная со второго, ведь первый – это не нужный нам >) и сравнивайте их с пробелом. Если символ не пробел, то дописывайте его к переменной, где будет храниться идентификатор. А как только попадется пробел – поменяйте значение переменной space_found на True. Пусть в режиме, когда выполняется условие space_found == True, цикл дописывает все остальные символы в переменную, где будет храниться описание; теперь уже сравнивать их с пробелами не нужно.

Задание 2. Распечатка данных в fasta-формате с желаемым числом букв в строке

Цель этого задания – добавить в Ваш скрипт возможность печатать на экран данные данные о последовательности в fasta-формате (так, чтобы при перенаправлении потока STDOUT в файл получился нормальный файл в fasta-формате) с любым заданным числом букв в строке последовательности.

Задание 3. Убедитесь, что скрипт работает

Проверьте правильность работы своего скрипта на файлах в fasta-формате, которые Вы создавали для генома вируса и для своего белка.

! Если Вы еще не перенесли файл с последовательностью своего белка в fasta-формате в директорию credits первого блока, сделайте это сейчас. Еще раз проверьте, что файлы в директории credits первого блока у Вас представляют собой файлы в fasta-формате – на них преподаватели будут проверять, действительно ли работает Ваш скрипт!

Необязательные задания (на дополнительные баллы)

Задание 4*. Коллекционер и победитель ошибок (продолжение)

Соберите коллекцию ошибок Вашего скрипта, с которыми Вы столкнулись в процессе работы. Предоставьте в папке credits второго блока протокол с обычным именем (например, Dibrova_pr6.doc), в котором будет приведена следующая информация об ошибках. Протокол оформите в удобном для Вас формате, но чтобы было понятно, что происходит. Про каждый случай укажите:

  1. Ошибка, выданная Python (чтобы получить текст ошибки в текстовый файл, а не просто на экран, воспользуйтесь подсказками к предыдущему занятию).

  2. Место в скрипте, вызвавшее ошибку (та строчка или строчки, из-за которых все пошло наперекосяк).
  3. Объяснение, что именно неверно.
  4. Исправленная, работающая версия.

Ошибки в протоколах за практикумы 5 и 6 не должны повторяться. Задание называется "Коллекционер и победитель ошибок", а не "Любитель гулять по граблям" :)