Kodomo

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

Учебная страница курса биоинформатики,
год поступления 2017

Подсказки к заданию 8

Python как калькулятор

Если набрать в командной строке слово python (без имени файла с программой) и нажать Enter, то интерпретатор питона запустится в интерактивном режиме, то есть будет выполнять введённые строки сразу после нажатия клавиши Enter. Чтобы выйти из этого режима, выполните команду quit() или нажмите Ctrl+D.

Преимущества у такого режима три:

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
>>> 

Выполнение операторов

   1 indata = open("input.txt", "r")
   2 inlist = indata.readlines()

приведёт к тому, что в переменной inlist окажется список строк файла "input.txt"

Циклы

При выполнении следующей программы:

   1 mm = [1, 2, 3, 4]
   2 for i in mm:
   3     j = i*i
   4     print i, j

будет напечатана таблица из чисел 1, 2, 3, 4 в первом столбце и их квадратов во втором столбце.

Следующая программа будет печатать ("раздетые") строки файла "ex.txt", пока не наткнётся на строку, в которой ничего нет, кроме пробелов и других байтов, удаляемых методом strip:

   1 indata = open("ex.txt", "r")
   2 s = indata.readline()
   3 s = s.strip()
   4 while len(s) > 0:
   5     print s
   6     s = indata.readline()
   7     s = s.strip()

Это пример цикла не по списку, а "пока выполнено условие", в данном случае len(s) > 0.

Функция "range"

Функция range имеет аргумент — целое число и возвращает список целых чисел от 0 до числа, на 1 меньшего, чем аргумент:

   1 >>> range(5)
   2 [0, 1, 2, 3, 4]
   3 >>> 

Эта функция удобна для использования в цикле, если нужно выполнить какие-либо операции для чисел от 0 до заданного. Например для подсчёта числа сочетаний из n по 2 можно написать:

   1 cn2 = 0
   2 for i in range(n):
   3     cn2 = cn2 + i

Для подсчёта факториала можно написать так:

   1 fact = 1
   2 for i in range(1, n + 1):
   3     fact = fact*i

(а что возвращает выражение range(1, n + 1), выясните сами. Постарайтесь также понять, что возвращает выражение вида range(2, 10, 3).)

Условия

   1 if a[0] == ">":
   2     print a

напечатает строку a, только если её первый символ есть ">".

Аргументы командной строки

Чтобы принимать данные из командной строки, нужно вставить в начало файла с программой строку

   1 from sys import argv

При запуске программы в переменную argv записывается список, в который попадают аргументы командной строки, то есть те слова, которые введены в командную строку после имени файла с программой. При этом первый аргумент имеет индекс 1 (а индекс 0 имеет само имя файла с программой). Например, пусть файл example.py содержит следующие строки:

   1 from sys import argv
   2 
   3 indata = open(argv[1], "r")
   4 print indata.readline()
   5 indata.close()

Если теперь запустить программу, указав в командной строке имя файла:

   1 python example.py test.txt

то программа напечатает первую строку файла test.txt.

Чтение содержимого файла (Дополнительные сведения)

В питоне есть несколько способов чтения содержимого файла. Первые два происходят из того, что вам до этого рассказывалось.

Чтение целиком построчно

   1 in_file = open("example.txt", "r")
   2 lines = in_file.readlines()
   3 for line in lines:
   4     #Do something
   5 in_file.close()

Этот способ приемлем для малых файлов. Для больших файлов можно предвидеть проблемы, что следует из рассказанных вам фактов про устройство компьютера.

Чтение файла построчно, наивный подход

   1 in_file = open("example.txt", "r")
   2 line = in_file.readline()
   3 while line:
   4     #Do something
   5     line = in_file.readline()
   6 in_file.close()

Способ приемлем, но есть более элегантный способ.

Чтение файла так, как это надо делать в 95% случаев

   1 in_file = open("example.txt", "r")
   2 for line in in_file:
   3     #Do something
   4 in_file.close()

В данном случае используется тот факт, что питон может интерпретировать файл как "список" строк

А ВОТ ТАК ДЕЛАТЬ НЕ НАДО

   1 in_file = open("example.txt", "r")
   2 in_file_str = in_file.read()
   3 lines = in_file_str.split("\n") 
   4 for line in lines:
   5     #Do something
   6 in_file.close()

Метод read() (без аргументов) возвращает всё содержимое файла разом. Непонятно, зачем здесь сначала читать файл целиком, а потом уже разбивать на строки — просто лишняя работа и расход памяти.

Измерение времени работы вашей программы (Дополнительные сведения)

Если у вас Linux/Mac и вы умеете работать через командную строку (для Windows что-то аналогичное есть, но...), то поможет команда time, которая просто ставится перед командой запуска скрипта.

   1 time python run.py

Если у вас Windows, то в принципе, для большого файла можете засечь секундомером...

Более правильный вариант: измерить время (в секундах) непосредственно в программе средствами python :

   1 from time import time
   2 
   3 start = time()
   4 # run your code
   5 end = time()
   6 print "Time:", end - start

Есть еще более правильные варианты (через модуль timeit, к примеру), но это выходит за рамки курса.