Для реализации алгоритмов мы будем использовать Python 2.7 и математическую библиотеку SciPy.
Почему именно они? И почему стоит их изучить?
Python -- это один из наиболее современных языков, как пишут его авторы: с акцентом на читаемость кода и удобство разработки. Таким образом все конструкции предельно просты и понятны, и если вы знаете любой другой язык программирования, то легко освоите Python. Код получается компактным и понятным. При этом Python портирован на все основные платформы, под него разработано множество библиотек, так что он является универсальным, и подойдёт под многие ваши задачи. А при помощи библиотеки SciPy можно ещё и добиться приличной производительности в вычислениях, которые мы будем производить.
Надеюсь, я вполне убедил вас потратить своё время на знакомство с этим языком. Именно этому и будет посвящен сегодняшний выпуск.
1. Скачиваем http://www.python.org/getit/releases/2.7.2/ и устанавливаем версию под нужную вам платформу. В дальнейшем нам потребуется установить SciPy, но пока мы пропустим этот шаг.
2. Для знакомства с Pyhon лучше всего подходит интерактивный режим. Запускаем python (под linux), либо Пуск -> Python 2.7 -> IDLE (Python GUI) (под Windows). Ну вот мы и готовы...
Переменные. Традиционно любые названия из букв, цифр, подчёркиваний. В Python переменные не нужно объявлять, можно сразу начинать с ними работать. Но если вы используете значение переменной, которой ничего не было присвоено, то возникнет ошибка. Итак, первым делом переменной нужно присвоить значение, например: >>> a=5
Теперь мы можем посмотреть значение переменной просто введя её название в интерактивную строку >>> a 5
Когда мы будем писать код не в интерактивном режиме, то для вывода значения переменной нужно будет использовать оператор print >>> print(a) 5
Обратите внимание на последнее вычисление 5/10=0. Не всегда нам будет удобно такое поведение, но Python 2 считает, что если мы используем целые числа, то ожидаем целочисленный результат деления. Если мы хотим дробный результат (числа с плавающей точкой, по-английски float), то нужно явно указать, что числа дробные одним из двух способов: 1) Явно задать дробное число, например 3.5, а если мы хотим задать число 5, то нужно указать 5.0, или сокращённо 5. >>> 5./10 0.5 2) Второй вариант, преобразовать имеющееся число в дробное, используя функцию float >>> float(5)/10 0.5 Как видим, если хоть одно число дробное, то итоговое число тоже вычисляется, как дробное.
Для тех, кто знаком с C/C++, Java, PHP, Perl отмечу, что в конце строки точка с запятой не нужна :-) Но если вы хотите выполнить несколько операции в одной строке, то их можно разделить точкой с запятой: >>> a=b/2;b=a*3
Да, и ещё в Python есть конструкции вида a*=2, что эквивалентно a=a*2. Аналогично a+=1 эквивалентно a=a+1. А вот операции a++ или a-- Python не поддерживает.
Считать научились. Поехали дальше. Условия и циклы. >>> if a>b: print(a) Здесь, думаю всё понятно. Ключевое слово if, и знак двоеточия формируют эту конструкцию. Если мы хотим выполнить несколько операций после if, то делаем так: 1) Компактный способ: пишем в одну строчку через точку с запятой >>> if a>b: a*=2; print(a) 2) Для больших кусков кода >>> if a>b: >>> a*=2 >>> print(a) И здесь мы впервые встречаемся с концепцией отступов. В большинстве популярных языков блоки, которые выполняются оператором if отделены фигурными скобками {}, или BEGIN-END, или чем-нибудь подобным. Ничего такого в Python нет. Правило простое, после оператора if появляется отступ (рекомендуемый отступ: 4 пробела). Когда действие if завершается, вы просто продолжаете писать код без отступа. >>> if a>b: >>> a*=2 >>> print(a) >>> print("Это напечатается в любом случае, независимо от оператора if") Это действительно удобно -- чётко видны логические блоки. И максимально компактно -- ни одного лишнего символа.
Естественно, если есть if, то есть и else. Так же есть elif = "else if". >>> if a>b: print("a больше b") >>> elif a=b:print("a равно b") >>> else: print("a меньше b")
С циклами конструкция аналогичная. Самый часто используемый цикл for выглядит так >>> for i in range(5): >>> print(i) 0 1 2 3 4
Цикл for перебирает все значения массива или списка. Функция range в свою очередь возвращает список последовательных чисел. range(N) вернёт список вида 0, 1, 2, ... N-1 -- всего N значений. Таким образом фикл for i in range(N) -- выполнится ровно N раз Если нам нужно начать не с нуля, то пишем так range(N1, N2). В этом случае вернётся список вида N1, N1+1, ... N2-1 Например >>> range(1,6) [1, 2, 3, 4, 5] А если нам нужно, чтобы переменная менялась не с шагов е единицу, а с любым другим целочисленным шагом, то мы задаём его третьим параметром. >>> range(1,6,2) [1, 3, 5]
Для тех, кто хорошо знаком с C/C++ etc такая конструкция покажется очень естественной если её представить в виде range(N) -- for(i=0;i<N;i++) range(N1,N2) -- for(i=N1;i<N2;i++) range(N1,N2,step) -- for(i=N1;i<N2;i+=step)
Цикл for можно прерывать оператором break, а также можно переходить к следуюещей итерации при помощи оператора continue
Ну и последняя на сегодня конструкция: объявление функций. Опять же всё просто и компактно >>> def printHello(name): >>> print("Hello world from "+name)
Функция определяется ключевым словом def, далее идёт имя фукнции, а в скобках параметры, которые она принимает. Как и в случае if и for далее необходимо двоеточие и отступы на всех последующих строчках, которые относятся к телу функции.
Функция может возвращать значение при помощи return
>>> def square(x): #возводит число в квадрат >>> return x*x >>> print(square(5)) 25
Да, кстати, комментарии в Python пишутся в любой строке после знака решётки #
На этом предельно краткое знакомство с языком закончено. Для желающих подробнее ознакомиться с этим замечательным языком: Учебник http://ru.wikibooks.org/wiki/Учебник_Python_2.6 Философия и особенности языка http://ru.wikipedia.org/wiki/Python
В следующий раз мы освоим математические функции и приступим к реализации линейной регрессии. А пока для тренировки рекомендую написать функцию, которая возводит число в любую целую степень. >>> def pow(x,N): ....