Учебная страница курса биоинформатики,
год поступления 2017
Подсказки к заданию 8
Python как калькулятор
Если набрать в командной строке слово python (без имени файла с программой) и нажать Enter, то интерпретатор питона запустится в интерактивном режиме, то есть будет выполнять введённые строки сразу после нажатия клавиши Enter. Чтобы выйти из этого режима, выполните команду quit() или нажмите Ctrl+D.
Преимущества у такого режима три:
- во-первых, python можно использовать как удобный калькулятор. При этом (в отличие от обычного калькулятора) промежуточные результаты можно "запоминать" в переменных и потом использовать столько раз, сколько надо.
- во-вторых, в таком режиме удобно проверять эффект встроенных функций, методов, операций и т.п.
- в третьих, имеется встроенный help. Например, выполнение команды:
help(sorted)
выдаёт краткую справку по функции sorted, а выполнение команды
help(str.split)
— по методу split, имеющемуся у объектов типа str.
Чтобы посмотреть список всех методов типа str, можно набрать команду:
dir(str)
При этом обращать внимание нужно в первую очередь на методы, чьё название не начинается с символа нижнего подчёркивания "_".
Далее примеры приводятся как копии консоли интерактивного режима интерпретатора python. Если что-то непонятно, рекомендуется самому выполнить соответствующую операцию...
Срез строки
>>> s = "abcde" >>> s[0] 'a' >>> s[4] 'e' >>> s[5] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: string index out of range >>> s[1:3] 'bc' >>> s[2:] 'cde' >>>
Логика: сравнение чисел и строк
>>> a = 1 >>> a == 1 True >>> a == 2 False >>> a != 2 True >>> a > 2 False >>> a < 2 True >>>
Помните разницу между = и ==: принципиально разные вещи!
>>> s = "abcde" >>> s == "abc" False >>> "abcde" == s True >>>
Логические операторы
or, and, not — если смысл не до конца понятен, выводите примеры вида:
>>> (2 == 1) or (2 > 1)
пока не станет понятен.
Несколько полезных методов
Перевод в верхний/нижний регистр:
>>> s = "abcd" >>> s.upper() 'ABCD' >>> su = "AbCd" >>> su.lower() 'abcd'
Проверка наличия символа (подстроки) в строке:
>>> s = "abcde" >>> "e" in s True >>> "g" in s False >>> "bc" in s True >>> "ac" in s False >>>
Пустая строка является подстрокой любой строки:
>>> "" in "abcde" True >>>
Списки
>>> el = [1, 3, 5] >>> el[0] 1 >>> el[1] 3 >>> len(el) 3 >>> el[3] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range >>> el + ["abc"] [1, 3, 5, 'abc'] >>> 3 in el True >>> "3" in el False >>> el[1:] [3, 5] >>>
Обратите внимание, что можно (и часто нужно!) оперировать со списками из одного элемента:
>>> al = [6] >>> len(al) 1 >>>
и даже со списком из нуля элементов (пустым списком):
>>> newl = [] >>> len(newl) 0 >>> newl = newl + ["word"] >>> len(newl) 1 >>>
Выполнение операторов
приведёт к тому, что в переменной inlist окажется список строк файла "input.txt"
Циклы
При выполнении следующей программы:
будет напечатана таблица из чисел 1, 2, 3, 4 в первом столбце и их квадратов во втором столбце.
Следующая программа будет печатать ("раздетые") строки файла "ex.txt", пока не наткнётся на строку, в которой ничего нет, кроме пробелов и других байтов, удаляемых методом strip:
Это пример цикла не по списку, а "пока выполнено условие", в данном случае len(s) > 0.
Функция "range"
Функция range имеет аргумент — целое число и возвращает список целых чисел от 0 до числа, на 1 меньшего, чем аргумент:
Эта функция удобна для использования в цикле, если нужно выполнить какие-либо операции для чисел от 0 до заданного. Например для подсчёта числа сочетаний из n по 2 можно написать:
Для подсчёта факториала можно написать так:
(а что возвращает выражение range(1, n + 1), выясните сами. Постарайтесь также понять, что возвращает выражение вида range(2, 10, 3).)
Условия
напечатает строку a, только если её первый символ есть ">".
Аргументы командной строки
Чтобы принимать данные из командной строки, нужно вставить в начало файла с программой строку
1 from sys import argv
При запуске программы в переменную argv записывается список, в который попадают аргументы командной строки, то есть те слова, которые введены в командную строку после имени файла с программой. При этом первый аргумент имеет индекс 1 (а индекс 0 имеет само имя файла с программой). Например, пусть файл example.py содержит следующие строки:
Если теперь запустить программу, указав в командной строке имя файла:
1 python example.py test.txt
то программа напечатает первую строку файла test.txt.
Чтение содержимого файла (Дополнительные сведения)
В питоне есть несколько способов чтения содержимого файла. Первые два происходят из того, что вам до этого рассказывалось.
Чтение целиком построчно
Этот способ приемлем для малых файлов. Для больших файлов можно предвидеть проблемы, что следует из рассказанных вам фактов про устройство компьютера.
Чтение файла построчно, наивный подход
Способ приемлем, но есть более элегантный способ.
Чтение файла так, как это надо делать в 95% случаев
В данном случае используется тот факт, что питон может интерпретировать файл как "список" строк
А ВОТ ТАК ДЕЛАТЬ НЕ НАДО
Метод read() (без аргументов) возвращает всё содержимое файла разом. Непонятно, зачем здесь сначала читать файл целиком, а потом уже разбивать на строки — просто лишняя работа и расход памяти.
Измерение времени работы вашей программы (Дополнительные сведения)
Если у вас Linux/Mac и вы умеете работать через командную строку (для Windows что-то аналогичное есть, но...), то поможет команда time, которая просто ставится перед командой запуска скрипта.
1 time python run.py
Если у вас Windows, то в принципе, для большого файла можете засечь секундомером...
Более правильный вариант: измерить время (в секундах) непосредственно в программе средствами python :
Есть еще более правильные варианты (через модуль timeit, к примеру), но это выходит за рамки курса.
Как понять, что строка является/не является числом
1) Вариант для ленивцев: Строка ошибки, которую выдает Python уже содержит подстроку Error, потому вам надо обеспечить только, чтобы ничего кроме ошибки не выдавалось.
2) Вариант, для любящих кодить (хоть и 🚴, но для начинающих - очень хорошая тренировка) Очевидно, что '-' может встречаться в числе только в начале числа и сразу после 'e' в экспоненциальной форме - "-234", "1e-17, "-1.2e-3".
Точка может встречать в числе только один раз и до 'e', если оно такие есть в числе. 'e'
'e' может встречаться в числе только один раз
'+' может встречать только после 'e'
3) Вариант, для умеющих гуглить (тоже полезный навык) - таки понять, как работает try ... except, валить надо ошибку ValueError
is_error = False try:
except ValueError: