До данного момента мы с вами разобрали цикл for. Этот цикл является наиболее часто используемым в питоне, однако иногда он все же неудобен. Например, если вы не знаете, сколько раз вам необходимо будет совершить определенное действие. Для такого рода проблем существует цикл while.
while не замена for
# Это пример НЕПРАВИЛЬНОГО использования while, тут намного правильнее делать цикл for
a = 0
while a < 10:
print (a)
a += 1
Допустим, вы ведете диалог с пользователем и выполняете какое-то действие, пока он не введет "stop". Вот здесь без while обойтись сложно
answer = input("Input number: ")
while answer != "stop":
answer = int(answer)
if answer % 2 == 0:
print("even")
else:
print("odd")
answer = input("Input number: ")
Коллекции - это какие-то наборы объектов разного или одного типа. 100 кошек, 10 собак, набор - [арбуз, тыква, голый землекоп], - все это является коллекцией.
В Python существует несколько разных типов, которые помогают вам хранить коллекции объектов в удобном для вас виде. Одним из базовых является список
Список - последовательность значений. В этом он похож на строки, но строки всегда являются набором символов, а в случае списка его элементами могут выступать любые типы в любой комбинации.
Есть несколько способов создать список, самым простым из них является просто заключить элемненты, из которых вы хотите создать список, в скобки
my_lst1 = ['apple', 5, True]
Можно даже положить список внутрь списка, такой список будет называться вложенным
my_lst2 = ['apple', ['tomato', 'fish'], 5]
Можно создать и пустой список, то есть список без элементов
empty_lst = []
Как и строки, списки можно индексировать, как и в случае строк, индексация начинается с 0. Возможно брать отрицательные индексы
my_lst2[1]
my_lst2[-1]
Напоминание для строк:
Точно так же, как и для строк, можно брать срезы
my_lst2[0:-1]
my_lst2[-1:]
Можно пройтись по списку, просто по очереди обращаясь к каждому из его элементов по индексу. Для этого полезна функция len, которая, как и в случае строки, возвращает длину списка.
my_lst3 = [1, 7, -5, 0, 32]
for i in range(len(my_lst3)):
print (my_lst3[i])
Однако в случае списков (и вообще всех коллекций в Python), можно использовать цикл for напрямую!
Именно этот путь рекомендуется использовать, а первый путь говорит о том, что автор кода, вероятнее всего, новичок
for elem in my_lst3:
print(elem)
for можно применить и для строк. В этом случае вы будете итерироваться по символам строки
s = "Hello, world"
for c in s:
print(c)
Операции над списками
Списки можно складывать (называется уже известным вам умным словом конкатенация)
a = [2,3,4]
b = [-5, 10]
a + b
a - b # Я по-прежнему не могу понять, а чего кто-то ожидал:)
a * b # аналогично
Однако, список можно повторить несколько раз, умножив его на число, однако это не рекомендуется к использованию кроме самых очевидных случаев (чуть позже разберем, почему)
[0] * 5 # так делают
Можно проверить, есть ли элемент в списке с помощью ключевого слова in
a = [1,3,10]
if 5 in a:
print ("5 is in a")
else:
print ("5 is not in a")
В случае со строками, если вы попробуете изменить какой-то символ, то выскочит ошибка
a = "Hello, world!"
a[-1] = "?"
Приходится делать, например, так:
a = a[:-1] + "?"
a
В случае со списками все намного проще. Они являются изменяемыми объектами
a = [1, -3, 10, 6]
a[-1] = 5
a
a[0:1] = [0,1]
a
a = [10, 5, 4]
b = a
a[-2] = 7
Что лежит в b?
b[-2]
В чем же секрет? Если вспомнить аналогию про кошку и ящик, то все становится ясно
В компьютере у вас есть великое множество коробок, в одну из которых вы положили кошку (в данном случае список). Но при этом вы решили называть эту коробку и a, и b. Python не создавал новой кошки в новой коробке. Просто у этой коробки теперь два имени. Потому, дразня кошку в переменной a, вы рискуете получить поцарапанные руки и в переменной b
colors = ['red', 'blue', 'green']
b = colors
Чтобы бороться с таким поведением Python, вам придется заставить его скопировать список!
a = [10, 5, 4]
b = a[:] # берем срез всего списка - это его скопирует
a[-2] = 7
print ("a", a)
print ("b", b)
Также можно использовать встроенную функцию Python - list
a = [10, 5, 4]
b = list(a) # берем срез всего списка - это его скопирует
a[-2] = 7
print ("a", a)
print ("b", b)
Список, как и многие другие встроенные типы в Python, имеет набор функций, предназначенных для работы с ним и вызываемых с помощью конструкции вида lst.method_name
append - Добавление в список
Хочется уметь достраивать список в ходе работы программы. Например, можем создать список всех нечетных чисел до 20
lst = []
for i in range(20 + 1):
if i % 2 == 1:
lst.append(i)
print (lst)
extend - хотим добавить в конец нашего списка другой
lst = [1, 4]
lst.extend([1,2,7])
lst
count - подсчитать число вхождений элемента в список
lst = [1, 7, -5, 6, 0, 1]
lst.count(1)
sort - отсортировать список на месте
lst.sort()
lst
index - найти первый индекс значения в листе, если значения нет, то вернется ошибка
lst.index(0)
Для строк, помимо разобранного на прошлом занятии метода split так же существует множество других методов. Обратите внимание, что, в отличии от списка, если эти методы подразумевают модификацию строки, то они возвращают НОВУЮ строку.
strip - удалить перенос строки и прочие "белые" символы по краям строки. Существуют аналоги - rstrip и lstrip, удаляющие эти символы только с одной стороны.
a = " hello \n"
b = a.strip()
print (b)
print("START:", a, "END")
replace - заменить все вхождения одной подстроки на другую
a = "hello, hello, hello"
b = a.replace("hello", "hell")
print(b)
find - найти вхождение подстроки в строку. Если подстроки нет в строке, то вернуть -1
a = "Hello, world"
a.find("world")
a.find("wild")
a = "hello, hello, hello"
f_ind = a.find("hello")
print (f_ind )
print (a.find("hello", f_ind + 1)) # искать с определенной позиции, поможет вам в домашнем задании
Чтобы проверить, содержится ли строка в другой строке, можно просто использовать ключевое слово in
print ("wo" in "world")
print ("he" in "world")
startswith - начинает ли строка на данную подстроку
print (a.startswith("hello"))
print (a.startswith("ello"))
endswith - заканчивается ли строка на данную подстроку
print (a.endswith("hello"))
print (a.endswith("he"))
join - объединить несколько строк через разделитель
", ".join(["1", "2", "apple"])
Одна из основных деятельностей в биоинформатике - это чтение и запись файлов)
Для того, чтобы открыть новый файл на запись служит команда open(filename, "w")
outfile = open("test1.txt", "w")
outfile
Для записи в файл используется команда write
outfile.write("1 3\n") # необходимо указывать перенос строки явно
outfile.write("1 10\n")
После работы с файлом его необходимо закрыть при помощи команды close
outfile.close()
Для того, чтобы открыть файл на чтение служит команда open(filename, "r")
infile = open("test1.txt", "r")
line = infile.readline() # прочитать одну строку из файла
line # возвращается с переносом строки
line.strip() # чаще всего полезно избавиться
print("Line: ", infile.readline().strip())
print("Line: ", infile.readline().strip())
Когда файл дочитан до конца, readline возвращает пустую строку
Файл надо закрыть!
infile.close()
Казалось бы, можно организовать чтение всего файла следующим образом:
infile = open("test1.txt", "r")
line = infile.readline()
while line != "":
print(line.strip())
line = infile.readline()
infile.close()
Однако в Python есть два механизма, которые помогают упростить код, написанный выше. Во-первых, для чтения файла можно использовать цикл for
Если вам нужно обработать все строки из файла одинаковым способом, то этот способ наиболее предпочтителен - он не только компактнее и соответствует стилю Python, но он еще и быстрее.
infile = open("test1.txt", "r")
for line in infile:
print(line.strip())
infile.close()
Один раз пройдя таким образом по файлу, при попытке пройти по нему второй раз, вы ничего не прочитаете нового - вы уже в конце файла
infile = open("test1.txt", "r")
for line in infile:
print(line.strip())
for line in infile: #won't be executed
print(line.strip())
infile.close()
Однако, можно заставить Python вернуться в начало файла командой seek
infile = open("test1.txt", "r")
for line in infile:
print(line.strip())
infile.seek(0) # go to the start of the file
for line in infile:
print(line.strip())
infile.close()
Возвращаясь к структуре кода, даже так в коде осталось небольшое неудобство. А что если мы забудем закрыть файл? Чаще всего - ничего, но мы можем столкнуться с кучей проблемой и труднообнаружимых ошибок из-за этого. Для решения этого вопроса было придум специальный блок with, который позволяет сказать Python закрыть файл автоматически по окончанию работы с ним.
Согласитесь, выглядит красиво:?
with open("test1.txt", "r") as infile:
for line in infile:
print(line.strip())
В случае с записью файл нужно быть еще более внимательным к закрытию файла, так как Python пишет изменения в сам файл не сразу, потому, неправильно завершив программу, вы можете остаться с файлом, в котором ничего нет.
Для примера использования with для записи запишем в новый файл четные числа до 100
with open("test2.txt", "w") as outfile:
for i in range(100 + 1):
if i % 2 == 0:
outfile.write(str(i) + "\n")
Иногда удобно, чтобы скрипт мог принимать аргументы через командую строку, например
python my_script.py 5 10
Все аргументы, которые передаются python при запуске, хранятся в специальном списке sys.argv. Для работы с ним нужно сделать немного, пока, магии:)
import sys
# так как мы сейчас в Jupyter notebook, то первый аргумент это скрипт, его запускающий, два других - аргументы, которые ему передали
sys.argv
sys.argv[0]
sys.argv[1]
sys.argv[2]