Учебная страница курса биоинформатики,
год поступления 2019
Материал к занятию 2
1. Тип bool и сравнения
Переменная типа bool может принимать два "логических" значения, True и False (без кавычек, с заглавной буквы). Такие значения можно комбинировать, используя операции and, or и not.
>>> a = True >>> b = False >>> a and b False >>> a and not b True
Числа можно сравнивать между собой, используя операции сравнения: ==, <, >, <=, >=, != (последний означает "не равно"). Результатом любой из этих операций является логическое значение.
Не путайте = (оператор присваивания значения переменной) и == (операцию сравнения).
Равенство == и неравенство != можно применять вообще к любым объектам питона.
Остальными неравенствами (>, <, >=, <=) можно сравнивать между собой не только числа, но и строки (для них "меньше" означает "раньше по алфавиту", при этом все заглавные буквы идут раньше строчных).
Для строк имеется ещё одна операция сравнения: in, которая выдаёт True, если строка слева от неё целиком входит в строку справа, и False в противном случае. Противоположная операция — not in. Примеры:
>>> "ac" in "abcde" False >>> "cd" in "abcde" True >>> "k" not in "abcde" True
2. Условный оператор if
Применение условного оператора выглядит так:
if <условие>: <оператор 1> <оператор 2> ... <оператор k> <оператор k+1> ...
При этом операторы 1, 2, ..., k будут выполнены только если значение условия было True, а операторы k+1 и последующие будет выполнены в любом случае. Две важные составляющие синтаксиса if:
- двоеточие после условия;
- отступ (здесь — четыре пробела), который помечает "блок" операторов, выполняемых только при истинности условия.
Отступ обязательно должен быть одинаковым в пределах одного блока и крайне желательно — во всей программе. В принципе можно использовать отступы в 2, 4 или 8 пробелов или один табулятор. Рекомендуемая величина отступа — четыре пробела.
3. Списки: тип list
Переменная типа list содержит список. Список задаётся перечислением его элементов (которые могут быть любыми объектами: числами, строками, логическим значениями, другими списками) в квадратных скобках через запятую. Примеры:
>>> al = [6, 9, 1, 2] >>> len(al) 4 >>> al[1] 9 >>> al + [7, 7] [6, 9, 1, 2, 7, 7] >>> sorted(al) [1, 2, 6, 9]
Со списками связаны два полезных метода строк: split() и join(). Примеры:
>>> s = "a bc def" >>> s.split() ['a', 'bc', 'def'] >>> s.split('c') ['a b', ' def'] >>> bl = ["ab", "cd", "efg"] >>> ", ".join(bl) 'ab, cd, efg' >>> '\t'.join(bl) 'ab\tcd\tefg'
Аргументом join должен быть список, содержащий только строки.
split бывает особенно полезен при чтении файлов (см. ниже), а join — при выдаче на консоль или записи в файл.
4. Срезы
Срезы выглядят одинаково для строки и для списка. Примеры:
>>> s = "abcde" >>> s[1:3] 'bc' >>> s[2:] 'cde' >>> s[:-1] 'abcd'
>>> al = [6, 9, 1, 2, 7] >>> al[1:3] [9, 1] >>> al[2:] [1, 2, 7] >>> al[:-1] [6, 9, 1, 2]
5. Циклы по списку и по диапазону чисел
Цикл по списку выглядит так:
for x in ["a", "b", "c", "d"]: <оператор 1> <оператор 2> ... <оператор k> <оператор k+1> ...
Операторы с 1 по k будут выполнены столько раз, какова длина списка, при этом каждый раз переменная x будет содержать другой элемент списка. Настоятельно не рекомендуется что-либо присваивать переменной x внутри цикла, запутаетесь. Основные требования те же, что к if, а именно, двоеточие и отступ из одинакового числа пробелов (или, не дай бог, табуляторов).
Цикл по диапазону:
for n in range(9): <оператор 1> <оператор 2> ... <оператор k> <оператор k+1> ...
ведёт себя точно так же, как цикл по списку [0, 1, 2, 3, 4, 5, 6, 7, 8].
6. Чтение текстового файла
Пусть есть текстовый файл, например "primer.txt". Все строки файла обрабатываются так:
xfile = open("primer.txt", "r") for line in xfile: <оператор 1> <оператор 2> ... <оператор k> xfile.close()
В переменную line будут по очереди попадать все строки файла. Имейте в виду, что такая строка всегда оканчиватся байтом переноса строки \n. Чаще всего он не нужен при обработке, поэтому правильный первый оператор такого цикла часто имеет вид x = line.strip('\n'). В переменную x попадёт копия строки line, но без переноса в конце.
Заодно уж про метод strip(): без аргументов он "раздевает" строку, убирая все невидимые символы (пробелы, табуляторы и переносы) до первого видимого и после последнего видимого.
>>> s = " \t abc def \t jj\n" >>> s.strip() 'abc def \t jj'
Если в читаемом файле могут оказаться ненужные пустые строки, то стоит вставить в начало цикла по файлу условный оператор вида if len(line.strip()) > 0: и все дальнейшие действия проводить уже внутри блока этого if'а.
(Кстати, замечание: на самом деле if len(s) > 0: эквивалентно просто if s:. Любой объект, попавший на место условия (после if), преобразуется к типу bool, при этом любая непустая строка превращается в True, а пустая — в False.)
7. Запись в файл
>>> nfile = open("newfile.txt", "w") >>> nfile.write("Hello!\n") >>> nfile.write("Something else\n") >>> nfile.close()
Аргументом метода write является строка. Не забывайте добавлять '\n' в нужных местах!