Kodomo

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

Учебная страница курса биоинформатики,
год поступления 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' в нужных местах!