|
Практикум 9. Модули, словари, PEP8.
Задание 1. Тригонометрия. Мнемоника: trigonometry.
Программа принимает угол в градусах (из командной строки) и печатает его синус и косинус
с четырьмя знаками после запятой. Значение угла может быть любым вещественным числом.
'''
This script calculates sin and cos of the angle given in degrees.
'''
import math
from sys import argv
if len(argv) > 1:
angle = float(argv[1])
inrad = math.radians(angle)
sinus = format(math.sin(inrad), ".4f")
cosinus = format(math.cos(inrad), ".4f")
print sinus+"\n"+cosinus
|
Задание 2. Случайная последовательность. Мнемоника: randomdna.
Для тестирования различных методов обработки биологических последовательностей часто
применяют случайные последовательности. Самый простой способ создать случайную последовательность
— это выбирать на каждую позицию последовательности случайную букву (одну из A, T, G, C)
с равной вероятностью.
Программа принимает в командной строке длину последовательности и создаёт файл randomseq.fasta,
в который пишет случайную последовательность заданной длины с именем "random" и без описания.
'''
This script creates a file "randomseq.fasta" and fills it with
a random DNA sequence of the length given in the argv[1]. It also
begins a new line after reaching the amount of letters
given in the argv[2].
'''
import random
from sys import argv
if len(argv) == 2:
length = int(argv[1])
outf = open("randomseq.fasta", "w")
outf.write(">random\n")
for length in range(length):
outf.write(random.choice("ATGC"))
outf.close()
if len(argv) == 3:
length = int(argv[1])
enter = int(argv[2])
outf = open("randomseq.fasta", "w")
outf.write(">random\n")
printed = 0
for i in range(length):
for j in range(enter):
if printed == length:
break
outf.write(random.choice("ATGC"))
printed += 1
if j == enter - 1:
outf.write("\n")
if printed == length:
break
outf.close()
|
Задание 3. Числа Фибоначчи. Мнемоника: fibonacci.
Числа Фибоначчи — элементы бесконечной числовой последовательности, в которой каждое последующее
число равно сумме двух предыдущих чисел.
Договоримся нумеровать элементы последовательности с нуля. Таким образом, нулевой элемент
последовательности равен 0, первый: 1, второй: 1 = 0 + 1, третий: 2 = 1 + 1 и т.д.
Программа принимает число N через аргументы командной строки и создаёт список членов
последовательности Фибоначчи с индексами от 0 до N включительно. Таким образом, в списке
будет N+1 элементов.
Полученный список программа выводит через пробел на консоль (т.е. посредством print)
без запятых и скобок [], через пробел.
'''
This script prints Fibonacci numbers until the index
given in the argv[1] is reached.
'''
from sys import argv
if len(argv) > 1:
elementov = int(argv[1])
posled = [0, 1]
for i in range(elementov + 1):
print (posled[i]),
posled.append(posled[-1] + posled[-2])
|
Задание 4. Подсчёт аминокислотного состава. Мнемоника: aacomp.
Написать программу, которая подсчитывает число разных букв в последовательности и выдаёт
полученную информацию в виде таблицы через табулятор.
Имена входного и выходного файлов задаются в командной строке (в варианте за один балл).
Подразумевается, что входной файл содержит одну последовательность в fasta-формате.
Выводится количество встреч всех букв (в последовательности, а не в названии или описании!).
Заглавная и соответствующая строчная буква должна пониматься как одна и та же буква.
Строки выдаваемой таблицы должны быть упорядочены по алфавиту.
Два балла вместо одного, если программа будет иметь более гибкий интерфейс, а именно:
если в командной строке задано два аргумента, то первый понимается как имя входного файла,
а второй – как имя выходного;
если задан один аргумент, то он понимается как имя входного файла, результат выводится на консоль;
если аргументов нет, то программа должна запросить имя входного файла у пользователя,
а результат выдать на консоль.
'''
This script counts the number of the amino acids' appearances
in one fasta-sequence. It uses argv[1] or raw_input as an
input file and argv[2] or console as an output place.
'''
from sys import argv
if len(argv) == 1:
fasta = raw_input("Please enter the file name:\n")
if len(argv) > 1:
fasta = argv[1]
inf = open(fasta, "r")
seq = []
begin = 0
for i in inf:
if ">" not in i:
line = i.strip()
if ">" in i or begin == 1:
if ">" in i and begin == 1:
break
begin = 1
line = i.strip()
seq.append(line)
inf.close()
aacids = dict()
for i in seq[1:]:
i = i.upper()
for j in i:
if j in aacids:
aacids[j] += 1
else:
aacids[j] = 1
if len(argv) < 3:
for i in sorted(aacids.keys()):
print i + "\t" + str(aacids[i])
if len(argv) == 3:
outf = open(argv[2], "w")
for i in sorted(aacids.keys()):
outf.write(i + "\t" + str(aacids[i]) + "\n")
outf.close()
|
Задание 5. Двойная порция. Мнемоника: double-lunch.
Каждому сотруднику фирмы присвоен уникальный номер. Каждому сотруднику разрешается
один раз пообедать за счёт фирмы. Однако некоторые сотрудники пытаются ухватить второй обед.
Программа получает на вход (в файле, имя которого указывается в командной строке)
номера сотрудников или STOP (одно значение на строке), если сотрудники прекратились.
После STOP файл может содержать ещё произвольное количество строк произвольного содержания.
Программа распечатывает номера сотрудников, заказавших два и более обедов
(встретившихся в файле более одного раза).
В выдаче программы не должно быть повторяющихся номеров.
'''
This script counts the amount of one person's appearances
in the file (before STOP) and prints peaople who
appeared twice or more.
'''
from sys import argv
if len(argv) > 1:
people = dict()
txt = open(argv[1], "r")
for i in txt:
if "STOP" in i:
break
person = i.strip()
if person in people:
people[person] += 1
if person not in people:
people[person] = 1
for key, value in people.items():
if value > 1:
print key
|
Задание 6. Поиск общих слов в файле с несколькими последовательностями. Мнемноника: common.
Программа принимает в командной строке имя входного файла и натуральное число k.
Подразумевается, что входной файл содержит более одной последовательности в fasta-формате.
Будем называть последовательность букв "общим словом", если в каждой из входных последовательностей
можно найти участок, в точности совпадающий с ней.
Программа должна выдавать на консоль все общие слова длины k, по одному на строке.
Если ни одного общего слова заданной длины нет, программа должна печатать "No common k-mers"
(например, "No common 9-mers", если k было равно 9).
'''
This script finds all common k-mers for the fasta-sequences.
'''
from sys import argv
if len(argv) > 2:
fasta = argv[1]
inf = open(fasta, "r")
seqs = []
'''
'seqs'-list will contain several lists with
the parts of genome related to one sequence;
for example, if fasta was like
>seq1
atatat
gcgcgc
cccccc
>seq2
aacgc
then 'seqs'-list will be like
[["atatat", "gcgcgc", "cccccc"], ["aacgc"]]
'''
ind = -1
line = inf.readline()
while line:
sline = line.strip()
if sline:
if '>' in sline:
seqs.append([])
ind += 1
if '>' not in sline:
seqs[ind].append(sline.upper())
line = inf.readline()
seqs1 = []
'''
'seqs1' will contain the united (whole)
sequences: for the previous example,
'seqs1' will be like
[atatatgcgcgccccccc, aacgc]
'''
for i in range(len(seqs)):
seq = ''
for j in range(len(seqs[i])):
seq += seqs[i][j]
seqs1.append(seq)
# fasta-file may contain gaps, numbers etc; so we need to ignore them
codes = ['A', 'R', 'N', 'D', 'B', 'C', 'E', 'Q', 'Z', 'G', 'H', 'X',
'I', 'L', 'K', 'M', 'F', 'P', 'S', 'T', 'W', 'Y', 'V', 'U']
seqs2 = []
'''
'seqs2' will be similar to 'seqs1',
but without unwanted simbols
'''
for i in seqs1:
seqright = ''
for j in i:
if j in codes:
seqright += j
seqs2.append(seqright)
k = int(argv[2])
kmers = set()
for i in range(len(seqs2[0])-k+1):
kmer = seqs2[0][i:(i+k)]
for j in seqs2[1:]:
if kmer in j:
normli = 'ok'
if kmer not in j:
normli = 'nope'
break
if normli == 'ok':
kmers.add(kmer)
if kmers:
for i in kmers:
print i
else:
print "No common", str(k)+"-mers"
|
|
|