Home About Materials FBB site

Практикум 8. Строки, списки, циклы, условия.

Задание 1. Пурин или пиримидин. Мнемоника: nucleobase.

Программа принимает в качестве первого аргумента командной строки одну из букв: A, T, G или C. Программа определяет, является ли основание производным пурина или пиримидина. Напоминание: аденин и гуанин являются производными пурина, а тимин и цитозин — пиримидина. Если введённое основание является производным пурина, программа печатает "purine", а если пиримидина — "pyrimidine". Два балла вместо одного, если программа:
правильно понимает буквы не только в верхнем, но и в нижнем регистре;
учитывает урацил (U), который тоже является производной пиримидина;
печатает что-нибудь понятное и адекватное, если символ в командную строку не введён или если введён символ (символы), не обозначающий (-ие) никакое азотистое основание. В сообщении об ошибке должна присутствовать подстрока "Error".

''' This script defines the given nucleobase as purine or pyrimidine. ''' from sys import argv if len(argv) > 1: letter = argv[1].upper() if letter == "A" or letter == "G": print "purine" elif letter == "T" or letter == "C" or letter == "U": print "pyrimidine" else: print "Error, please input a nucleobase (A, T, G, C or U)" else: print "Error, please input a nucleobase (A, T, G, C or U)"

Задание 2. Деление строки. Мнемоника: split.

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

''' This script prints float versions of numbers given in the 1 line of your file. ''' from sys import argv if len(argv) > 1: txt = open(argv[1], "r") line = txt.readline() txt.close() normli = "ok" for i in line.split(): try: float(i) except ValueError: normli = "Error" print normli+", the string contains non-numerical signs" break if normli == "ok": for i in line.split(): print float(i) if len(argv) <= 1: print "Error, please input the name of the file"

Задание 3. Среднее по больнице. Мнемоника: average.

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

''' This script shows the average of the numbers in the first line of your file. ''' from sys import argv if len(argv) > 1: txt = open(argv[1], "r") line = txt.readline() txt.close() summa = 0 for i in line.split(): summa += float(i) average = summa / len(line.split()) print "The average of these numbers is", average

Задание 4. Медиана. Мнемоника: median.

Статистика учит, что иногда медиана гораздо лучше характеризует выборку, чем среднее. (К примеру, если человек ищет работу, то средняя зарплата в организации не особенно полезна, в отличие от медианы.) Задание аналогично предыдущему, но программа печатает не среднее, а медиану.

''' This script shows the median of the numbers in the first line of your file. ''' from sys import argv if len(argv) > 1: txt = open(argv[1], "r") line = txt.readline() txt.close() normli = "ok" numbers = [] for i in line.split(): try: numbers.append(float(i)) except ValueError: normli = "Error" print normli+", the string contains non-numerical signs" break if normli == "ok": numbers = sorted(numbers) ind1 = len(numbers)/2 if len(numbers)%2 == 0: median = (numbers[ind1] + numbers[ind1-1])/2 if len(numbers)%2 != 0: median = numbers[ind1] print median if len(argv) <= 1: print "Error, please input the name of the file"

Задание 5. Имена последовательностей. Мнемоника: fastanames.

Напоминаем, что в fasta-формате именем последовательности считается часть строки описания (т.е., строки, начинающейся с >) между знаком > и первым пробелом, если же пробела нет вообще, то от знака > до конца строки. Программа получает в командной строке имя файла в fasta-формате и печатает список имён последовательностей, по одной на строке. Если файл не соответствует заявленному формату, то выдается ошибка, содержащая подстроку "Error".

''' This script provides you with the names of the sequences in your fasta-file. ''' from sys import argv if len(argv) > 1: txt = open(argv[1], "r") line = txt.readline() summa = 0 while int(len(line)) > 0: sline = line.strip() if int(len(sline)) > 0: ind = line.find(">") if ind == 0: summa += 1 spl = line.split() print str(spl[ind])[1:] line = txt.readline() if summa == 0: print "Error, wrong format of the file" txt.close()

Задание 6. Простое число. Мнемоника: prime.

Простое число — это натуральное (целое положительное) число, имеющее ровно два различных натуральных делителя. Другими словами, число p простое, если оно больше 1 и делится только на 1 и на p. (Внимание: числа 0 и 1 простыми не являются; никакие отрицательные числа тоже не будем считать простыми).
Написать программу, которая (понятными словами) просит ввести целое число; получив его, программа сообщает, является ли введённое число простым. Если число является простым, программа выводит слово "Prime", иначе выводит "Not prime". Подразумеваем, что ввод пользователя правилен (представляет собой целое число).

''' This script tells if the number is prime or not. ''' number = int(raw_input("Please enter a whole number:\n")) if number <= 1: print "Not prime" else: delitel = 2 while number != delitel: if number%delitel == 0: print "Not prime" break delitel += 1 if number == delitel: print "Prime"

Задание 7. Кодирующие участки, описанные в файле GenBank. Мнемоника: cds.

Написать программу, считающую число аннотированных в файле формата GenBank кодирующих белок последовательностей (CDS). Имя файла вводится в командной строке.

''' This script provides you with the number of CDS in your gbk-file. ''' from sys import argv if argv > 1: gbk = open(argv[1], "r") summa = 0 for line in gbk: if line.strip() > 0: if line.find("CDS") == 5: # "CDS" is always standing in the position 5:8 # summa += 1 gbk.close() print summa

Задание 7(доп.). CDS в файле GenBank. Способы чтения файла, время.

Написать программу, решающую задачу в трех вариантах, меняя способ чтения файлов. Протестировать получившийся результат на файлах .gbk разного размера. Сравнить время работы трех вариантов.

''' This script uses 3 different ways of reading a file to calculate the numder of CDS in your gbk-file and prints not only this number itself but also the time required to calculate it using the certain way of file-reading. ''' from time import time from sys import argv start = time() if len(argv) > 1: gbk = open(argv[1], "r") summa = 0 line = gbk.readline() while len(line) > 0: if len(line.strip()) > 0: if line.find("CDS") == 5: summa += 1 line = gbk.readline() gbk.close() print "postrochno:", summa end = time() print "postrochno, time:", end - start start = time() if len(argv) > 1: gbk = open(argv[1], "r") summa = 0 lines = gbk.readlines() for line in lines: if len(line.strip()) > 0: if line.find("CDS") == 5: summa += 1 gbk.close() print "zelikom:", summa end = time() print "zelikom, time:", end - start start = time() if len(argv) > 1: gbk = open(argv[1], "r") summa = 0 for line in gbk: if len(line.strip()) > 0: if line.find("CDS") == 5: summa += 1 gbk.close() print "krasivo:", summa end = time() print "krasivo, time:", end - start


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