Python - динамически типизированный язык. При определении переменной ее тип выводится интерпретатором автоматически в зависимости от того какой тип данных ей присвоен. Разделитель команд в языке - перенос строки. Область видимости кода регулируется однотипными отступами, например знаками табуляции.
Коллекции
В Python встроены в язык следующие структуры данных
Set и Map построены на базе хеш таблиц, поэтому элементы множества и ключи отображения должны быть хэшируемыми. Хэшируемуе типы имеют __hash__ и __cmp__ функции, результат которых не должен изменяться. Так как hash - это идентификатор состояния объекта, то чтобы этот идентификатор не менялся необходимо избежать изменения состояния объекта. Таким образом Tuple - хэшируемый тип и может быть использован в качестве ключа Map’ы, а List - нет.
Итераторы
Коллекции по другому называют контейнерами данных. Внутри контейнера данные хранятся очень по-разному. При этом контейнеры, как правило, являются итерируемыми объектами, т.е. можно пробежаться по всем элементам коллекции, например в цикле. Цикл в данном случае - это синтаксический сахар, скрывающий итерирование по коллекции с помощью итератора. Итератор - это дизайн паттерн, который отделяет логику и состояние конкретного процесса итерирования от самой коллекции. Итерируемый контейнер должен реализовывать как минимум один метод __iter__, который конструирует итератор и возвращает его в качестве результата. Далее встроенная в Python функция iter сама обратится к функции __iter__ коллекции для создания итератора. Сам объект итератора должен реализовывать метод next, который каждый раз возвращает следующий элемент коллекции. Если перебраны все элементы коллекции, то как правило выбрасывается исключение StopIteration, говорящее само за себя.
Генераторы
Иногда последовательность элементов предопределена какой-нибудь функцией, например, числа фибоначчи или просто последовательность натуральных чисел. Хранить все числа в контейнере невозможно, так как последовательность бесконечная, при этом подсчитать числа заранее тоже не всегда получается, т.к. ряд алгоритмов работают с произвольным диапозоном такой последовательности. Имеет смысл реализовать такую структуру, которая в отличие от контейнеров, хранила не данные, а описывала функцию генерации определенной последовательности элементов. Итератор такой структуры тогда в методе next создавал бы очередной элемент последовательности прямо в момент обращения к этому элементу. Такие структуры в Python называются генераторами. Есть ряд генераторов, встроенных в стандартную Python библиотеку.
Функции
В Python есть ряд встроенных функций, например range - функция, которая создает список из арифметической прогрессии. Например range(3) вернет (0, 1, 2, 3).
Другая встроенная функция - xrange(3) вернет генератор списка, то есть элементы списка будут создаваться по мере обращения к ним, а не в момент создания генератора. Что сильно экономит используемую оперативную память.
Условный оператор
Вместо логической константы как правило используется логическое выражение, результатом которой должна быть та самая логическая константа, например:
Логическое выражение может быть составным, части которого могут быть объединены используя логический оператор & или |. Первый - это логическое “И”, второй - это логическое “ИЛИ”. Например:
Циклы
Классы, модули и пакеты
В простейшем случае можно писать используя только функции, но как только этих функций становится огромное количество, то программа становится слабоструктурированной и сложночитаемой. Чтобы этого избежать, можно раскидать ваши функции по отдельным тематическим файлам - модулям.
Когда модулей становится много, то их также можно логически сгруппировать по пакетам (package). Фактически это папки в файловой системе.
Основы функционального программирования в Python
В Python можно писать в функциональном стиле, передавая одни функции в качестве аргументов другим функциям и строя свои абстракции на базе функций.
В основе как правило любой подобной абстракции лежат функции высшего порядка, то есть функции, которые в качестве аргумента принимают другие функции. В Python наиболее распространенные функции высшего порядка встроены в базовую библиотеку языка.
Подобное выражение можно написать проще:
Другая распространенная функция высшего порядка - filter - которая фильтрует только те элементы коллекции, которые удовлетворяют определенному условию. Условие задается в виде функции, которая принимает в качестве аргумента элемент коллекции, а возвращает True, если элемент удовлетворяет условия и False, если нет.
Подобные трансформации коллекции гораздо проще записать используя расширенный синтаксис цикла for:
Многопоточность
Возможность выполнять разные инструкции параллельно на одной машине таит в себе много подводных камней. Например, если эти инструкции работают с одними и теми же переменными в коде одновременно, то состояние программы в общем смысле неопределенно, т.е. в отличие от последовательно исполнимой программы можно получить неожиданный и неправильный результат из-за гонки состояний, грязных чтений, а если начать синхронизировать оборащение к общему состоянию из разных потоков, то можно познакомится с такой штукой как deadlock или даже livelock.
В Python подобные проблемы многопоточного программирования решены прямо на уровне интерпретатора. Решение носит название Global Interpreter Lock (GIL). В любой момент времени Python интерпретатор исполняет инструкцию только одного потока, блокируя остальные независимо от количество ядер процессора.
Т.е. настоящей многопоточности в Python нет. Соответственно выигрышь в производительности на многоядерных машинах в Python получить немного сложнее, чем на платформе, поддерживающей многопоточность полноценно.
Заключение
Этой базы по-моему мнению должно хватить, чтобы начать осмысленно писать на Python простейшие приложения, что я и собираюсь делать в ближайшем будущем. С другими аспектами познакомимся дальше уже по ходу дела.
Статьи будут выходить по понедельникам и четвергам. Так что подписывайтесь на мой журнал и делитесь им со своими друзьями. Стоит ли говорить как это мотивирует автора на дальнейшие подвидиги. Отвечаю на комментарии.