Home About Materials FBB site

Практикум 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"


© Титова Алена, 2017