Kodomo

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

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

Дата посл. изменения 6 ноября 2013 ДД

1. Общее правило при написании любого скрипта длиннее 10 строк

Никогда не пытайтесь написать сразу полностью работающий скрипт! В 99,99% случаев он не будет работать, будет выдавать 100 глупых ошибок, а в попытках заставить его работать можно даже самые крепкие нервы истончить!

Пусть, например, Вы хотите написать скрипт, разбирающий сложный файл: не нужно сразу писать цикл на 30 строк! Начните с открытия файла и цикла, который проходит по строкам файла с заранее заданным именем (скажем, "1.txt") и выводит их на экран. Не забудьте закрыть файл. Попробуйте запустить эту программу из 4-5 строк и проверьте, действительно ли содержимое заданного файла выводится на экран. Любую ошибку (ввели имя без кавычек, попробовали закрыть файл через close(myfile), мало ли что) Вы в таком скрипте увидите сразу. Теперь хотите вы, чтобы скрипт обращал внимание только на строки, начинающиеся с символа >: добавьте в тело цикла условие if и выведите теперь на экран только строки, удовлетворяющие условию. Проверьте, правильно ли скрипт Вас понял! И т.д., и т.п.

Итак: не нужно писать код на N строк с надеждой "авось заработает" и без четкого плана, а потом пару часов биться с ним, чтобы его исправить. Программирование – это нелегкий труд, напряжение ума и оттачивание логики, последовательности в своих действиях, поэтому лучше написать 5 строчек, которые есть маленький шажок к намеченной цели, и обдумать, где у Вас "затык" (или попросить совета), нежели написать 500 строчек, которые не работают, и полагать, что у Вас нету "дара" программирования, коли с первого же раза не получилось.

2. "Все по существу написано правильно, а печатается не fasta-формат" - что делать?

Ошибка очень распространенная, пожалуйста, обратите внимание! Команда print не знает, что нужно выдать на экран значения переменных дабы вышел fasta-формат, поэтому вот такой код НЕ позволит получить нужный результат:

   1 prot_id = "YP_001"
   2 description = "hypothetical"
   3 sequence = "MAAAAAAA"
   4 
   5 print prot_id
   6 print description
   7 print sequence

В разделе 4.3 подсказок рассказывается о том, как можно использовать команду print, в том числе с примером ее использования вместе с операцией подстановки (через %). Это поможет исправить досадную ошибку.

3. Использование print со скобками

В Python 2.7 print это НЕ ФУНКЦИЯ. Поэтому при вызове этой штуки писать круглые скобки не нужно, это приводит к ошибкам! Например, вот такой код приведет к тому, что напечатано будет не YP_001 и hypothetical через пробел, как Вы ожидаете, а то, что указано в комментарии:

   1 prot_id = "YP_001"
   2 decription = "hypothetical"
   3 
   4 print (prot_id, description) # ('YP_001', 'hypothetical')

Дело в том, что в этом случае создается кортеж (что-то вроде списка) из двух переменных, и Вы его выводите на печать! Чтобы добиться нужного результата, удалите скобки.

4. Задавайте классы (и функции) ВСЕГДА ДО кода самого скрипта

Это позволит избежать ошибочного использования переменных, которые определяются выше в скрипте. В примере ниже (ВНИМАНИЕ: ТАК ДЕЛАТЬ НЕЛЬЗЯ!) в строке 1 пользователь вводит имя, а потом задается класс. В его инициализирующей функции атрибуту класса с именем name присваивается значение из переменной input, которая была определена выше, и вроде бы даже все будет работать правильно. Но переменная input не входит в число аргументов функции __init__(), она в данном случае называется глобальной переменной.

   1 # NEVER DO LIKE THIS
   2 input = raw_input("Enter your name: ")
   3 class Human:
   4     def __init__(self):
   5         self.name = input # THIS IS WRONG! NEVER EVER DO IT LIKE THIS!
   6 you = Human()
   7 print "Human with the name %s was created" % you.name

Пожалуйста, запомните одну вещь, одно из "золотых правил" программирования:

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

Почему так (одна из многих причин): по своей сути, заданный класс (как и заданная отдельная функция) – это элемент кода, который, начиная со строки def ... или class ... и включая все строчки, идущие с отступом, можно вырезать и перенести в любое место, например, в другой скрипт, и они там будут работать как ни в чем не бывало.