Pythonista. привет, python
Содержание:
- История создания языка Python
- And Now for Something Completely Different
- Что такое оператор?
- Операторы присваивания
- Функции
- Other Useful Items
- Списки, кортежи, множества и словари
- Python в крупных компаниях
- Модули, библиотеки, import
- Строки
- Синтаксис питона
- Синтаксис
- Major new features of the 3.9 series, compared to 3.8
- Сравнение при помощи оператора != переменных одного и двух типов
- Логический оператор AND в Python
- Major new features of the 3.9 series, compared to 3.8
- Рекомендации по ФП на языке Python
- Переменные в Python
- 2.2. The Interpreter and Its Environment¶
- Включение в последовательность
- Что такое виртуальные среды или окружения языка Python?
История создания языка Python
Разработка осуществлялась в конце 80-х программистом Гвидо ван Россумом, который на момент создания работал в голландском центре информатики и математики. Разработка велась в свободное от работы время, в качестве основы был взят язык ABC.
Возникновение Python можно разделить на 3 этапа:
- Февраль 1991. Исходный код публикуется на alt.sources, условно назовем его Python 1. Уже в тот момент «Пайтон» поддерживал ООП, был способен работать с классами, функциями, наследованием, обработкой исключений, а также поддерживал все основные структуры данных.
- 2000 год. Создана 2-я версия Python. Добавили важные инструменты, такие как сборщик мусора и поддержку Юникода.
- 3 декабря 2008. Выходит Python 3. Эта версия до сих пор основная. Ряд особенностей переделали, что привело к несовместимости с прошлыми версиями. Говоря о функциональности, скажем, что 3-я версия в этом плане не уступает 2-й, однако развитие языка уже тогда разделилось на 2 ветки. Некоторые продолжили использовать Python 2, что было необходимо для поддержки старых проектов, некоторые полностью перешли на 3-ю версию, опасаясь, что вторую поддерживать перестанут, хотя надо добавить, что дату «смерти» Python 2 с тех пор неоднократно переносили, продлевая поддержку все снова и снова.
And Now for Something Completely Different
trong>Interviewer (John Cleese): You know I really enjoy interviewing applicants for this management training course. (knock at door) Come in. (Stig enters) Ah. Come and sit down.
Stig (Graham Chapman): Thank you. (he sits)
Interviewer: (stares at him and starts writing) Would you mind just standing up again for one moment. (Stig stands up) Take a seat.
Stig: I’m sorry?
Interviewer: Take a seat. (Stig does so) Ah! (writes again) Good morning.
Stig: Good morning.
Interviewer: (writes) Tell me why did you say ‘good morning’ when you know perfectly well that it’s afternoon?
Stig: Well, well, you said ‘good morning’. Ha, ha.
Interviewer: (shakes head) Good afternoon.
Stig: Ah, good afternoon.
Interviewer: Oh dear. (writes again) Good evening.
Stig: …Goodbye?
Interviewer: Ha, ha. No. (rings small hand-bell) … Aren’t you going to ask me why I rang the bell? (rings bell again)
Stig: Er why did you ring the bell?
Interviewer: Why do you think I rang the bell? (shouts) Five, four, three, two, one, ZERO!
Stig: Well, I, I…
Interviewer: Too late! (singing) Goodniiight, ding-ding-ding-ding-ding.
Version | Operating System | Description | MD5 Sum | File Size | GPG |
---|---|---|---|---|---|
Gzipped source tarball | Source release | 798b9d3e866e1906f6e32203c4c560fa | 25640094 | SIG | |
XZ compressed source tarball | Source release | ecc29a7688f86e550d29dba2ee66cf80 | 19051972 | SIG | |
macOS 64-bit Intel installer | macOS | for macOS 10.9 and later | d714923985e0303b9e9b037e5f7af815 | 29950653 | SIG |
macOS 64-bit universal2 installer | macOS | for macOS 10.9 and later, including macOS 11 Big Sur on Apple Silicon (experimental) | 93a29856f5863d1b9c1a45c8823e034d | 38033506 | SIG |
Windows embeddable package (32-bit) | Windows | 5b9693f74979e86a9d463cf73bf0c2ab | 7599619 | SIG | |
Windows embeddable package (64-bit) | Windows | 89980d3e54160c10554b01f2b9f0a03b | 8448277 | SIG | |
Windows help file | Windows | 91482c82390caa62accfdacbcaabf618 | 6501645 | SIG | |
Windows installer (32-bit) | Windows | 90987973d91d4e2cddb86c4e0a54ba7e | 24931328 | SIG | |
Windows installer (64-bit) | Windows | Recommended | ac25cf79f710bf31601ed067ccd07deb | 26037888 | SIG |
Что такое оператор?
Под оператором в любом языке программирования подразумевают символ, который выполняет определенную операцию с частями информации – переменными или значениями. Такие данные называются операндами.
В Python есть 7 базовых типов операторов:
- Арифметические. Предназначены для выполнения стандартных операций типа сложения, вычитания, умножения или деления. Также есть ряд других арифметических операторов, которые будут рассмотрены далее.
- Операторы сравнения. Они берут операнд 1, операнд 2 (и так далее) и сравнивают их между собой. Например, этот оператор может сказать, является ли первая переменная больше второй, или же они равны и так далее.
- Операторы присваивания. Один из самых часто используемых типов операторов в Python. С его помощью осуществляется целый комплекс операций как самых простых (присваивание значения переменной), так и более сложных (возврат вывода функции в переменную).
- Логические операторы. С их помощью программист может соединить несколько условий, или сравнивать их между собой по логическому признаку.
- Операторы принадлежности. Выполняют простую проверку, относится ли конкретное значение определенному объекту (например, кортежу или списку).
- Операторы тождественности. С помощью этих операторов также выполняется сравнение операнд на предмет того, являются ли они одинаковыми. Но это немного отличается от операторов сравнения, поскольку проверка выполняется на предмет того, занимают ли они одно и то же место в памяти.
- Битовые. Эти операторы во многом работают так же, как другие, только выполняют операции по битам.
А теперь перейдем к рассмотрению каждого из этих типов операторов более подробно.
Операторы присваивания
Теперь перейдем к рассмотрению операторов присваивания. Они предназначены для того, чтобы передавать переменной определенные значения как принадлежащие другим переменным, так и появившиеся вследствие их обработки. Операторы присваивания нужны еще и для того, чтобы назначать переменным объекты, с которыми можно дальше выполнять определенные действия.
Таким образом, спектр применений операторов этого типа довольно обширный.
Присваивание. Выглядит, как математический знак «равно». Это классический оператор, типичный пример применения которого – присваивание значения переменной. Давайте приведем такой пример.
>>> a = 7
>>> print(a)
7
Сложение и присваивание. Этот оператор не просто присваивает правую часть левой, но и увеличивает её на определённое значение.
Выглядит он, как знак плюса и равно вместе (+=).
Чтобы было более понятно, давайте рассмотрим этот код.
>>> a += 2
>>> print(a)
После выполнения соответствующих арифметических действий интерпретатор выдаст значение 9 при условии, что значение переменной a было 7.
То есть, этот оператор идентичен выражению a = a + 2.
Вычитание и присваивание. Противоположный предыдущему оператор. Если мы используем выражение a -= 2, это будет значить то же самое, что и выражение a = a – 2.
Деление и присваивание. Выполняет операцию деления между двумя операндами. После этого получившееся значение присваивается соответствующей переменной. Позволяет два действия: деление и присваивание запрограммировать всего одной строчкой кода. Можно также использовать переменные, объекты и другие значения, которые можно присвоить левой части, в правой.
Приведем пример.
>>> a /= 7
>>> print(a)
Умножение и присваивание. Выполняет аналогичную последовательность действий для двух операндов. Сначала выполняется арифметическая операция с двумя операндами, а потом получившееся значение присваивается левому. В данном случае такой арифметической операцией служит умножение.
>>> a *= 8
>>> print(a)
Деление по модулю и присваивание. Этот оператор выполняет сразу три действия:
- Делит первый операнд на второй.
- Определяет целое число.
- Присваивает это целое число той переменной, которая находится в правом операнде.
Синтаксис элементарный:
>>> a %= 3
>>> print(a)
Эта программа выполняет три описанных выше действия, после чего получившийся результат печатает в консоли или нижней строке онлайн-интерпретатора. Например, если переменная a = 10, то будет выведено число 3.
Возведение в степень и присваивание. Этот оператор выполняет два действия:
- Берет левый операнд и возводит его в степень, равная числу справа.
- Получившееся число сразу становится значением переменной слева.
Здесь, как и в других операторах, можно использовать переменные в качестве правого операнда. Например, если в левой части находится переменная с числом 4, а в правой – число 2, то на вывод будет отправлено число 16.
>>> a **= 2
>>> print(a)
16
Деление с остатком и присваивание. В принципе, вы уже поняли, как работает и записывается выражение с этим оператором. Он может получать остаток от деления первого числа на второе и возвращать его в ту переменную, которая стоит справа. Например, эта программа выводит остаток от деления на экран.
>>> a //= 3
>>> print(a)
Функции
Функция – это часть кода, принимающая аргументы и возвращающая вычисленное значение. Аргумент – это объект, отправляемый в функцию. Аргументом может быть какое-нибудь значение или ссылка на него.
функции языка программирования Python
В функции используются параметры и их число не ограничено. Число аргументов соответствует параметрам. Функцию можно объявить в любом месте. Она записывается как:
— def <имя функции> (): — после определения функции ставиться двоеточие, аргументы функции заключаются в круглые скобки. После двоеточия идет со следующей строки отступ и тело функции.
Для выхода из функции используется оператор return, который возвращает значения. Если оператор return не указан, то произойдет возврат значения None.
Функции бывают встроенные и пользовательские. В интерпретаторе Python есть ряд часто используемых функций. Они всегда доступны и можно посмотреть документацию с их описанием и примерами применения. Например, при помощи функции input () можно ввести данные с клавиатуры, а при помощи функции print () вывести данные в консоль. Так, print (“Hello, World!”) выводит строку «Hello, World!».
Еще одной интересной функцией является декоратор. Декоратор позволяет расширить возможности функции, не меняя ее кода, при помощи обертывания функции другой функцией.
Существует возможность написать свою собственную функцию для нужных задач. Кроме этого есть много функций, которые существуют в библиотеках Python и также могут быть использованы при написании скриптов. Для этого нужно скачать нужную библиотеку и импортировать ее.
Other Useful Items
- Looking for 3rd party Python modules? The
Package Index has many of them. - You can view the standard documentation
online, or you can download it
in HTML, PostScript, PDF and other formats. See the main
Documentation page. - Information on tools for unpacking archive files
provided on python.org is available. -
Tip: even if you download a ready-made binary for your
platform, it makes sense to also download the source.
This lets you browse the standard library (the subdirectory Lib)
and the standard collections of demos (Demo) and tools
(Tools) that come with it. There’s a lot you can learn from the
source! - There is also a collection of Emacs packages
that the Emacsing Pythoneer might find useful. This includes major
modes for editing Python, C, C++, Java, etc., Python debugger
interfaces and more. Most packages are compatible with Emacs and
XEmacs.
Списки, кортежи, множества и словари
Списки, кортежи, множества и словари – еще 4 типа данных в Питоне, включающие в себя несколько значений и являющиеся итерируемыми (перебираемыми, как строки).
Особенности показаны в таблице 3.
Список (list) | Кортеж (tuple) | Множество (set) | Словарь (dict) |
Изменяемый | Неизменяемый | Изменяемое | Изменяемый |
Значения могут дублироваться | Значения могут дублироваться | Значения не могут дублироваться | Ключи не могут дублироваться |
Доступ по индексу возможен | Доступ по индексу возможен | Доступ по индексу невозможен | Есть доступ к ключам и значениям |
Таблица 3 – Коллекции данных в Python
Список – последовательность произвольных элементов, разделенных запятой. Обозначается квадратными скобками. Можно доставать отдельные составляющие через индекс, добавить в начало списка или конец те или иные значения, удалить элементы, узнать длину, отсортировать.
Рассмотрим часть функционала.
Результат работы скрипта:
Когда необходимо запретить изменение коллекции, ее удобно представлять в виде кортежа. Более того, он занимает меньшее количество в памяти. Записывается в круглых скобках.
На их основании также возможны срезы, доступ по индексу, нахождение максимума или минимума (если элементы представлены числами), поиск количества вхождений значений.
Результат работы скрипта:
Множества хороши в ситуациях, когда нужна гарантия уникальности всех элементов. Задаются фигурными скобками. При добавлении дубликата размер сета никак не меняется
Важно и то, что порядок объектов внутри множества не гарантирован, что исключает доступ по индексу
Результат работы скрипта:
Словарь – особый тип коллекций. Все его элементы состоят из пар «ключ: значение». Ключ должен быть уникальным, а значения могут повторяться. Обозначается фигурными скобками.
Рассмотрим некоторые операции со словарями.
Результат работы скрипта:
Таким образом, в зависимости от ситуации применяется тот или иной тип коллекций. Чаще всего это списки и словари.
Python в крупных компаниях
Неудивительно, что при такой универсальности Python применяют многие крупные IT-компании.
В Amazon и Spotify используют Python для анализа пользовательских данных, информации о продажах и разработки персонализированных рекомендаций.
В Walt Disney применяют этот язык в качестве скриптового для анимации.
YouTube и Instagram… Эти проекты полностью написаны на Python. Кроме того, холдинг Alphabet использует «питон» для скрейпинга в Google — извлечения данных со страниц веб-ресурсов.
Netflix создала свой рекомендательный сервис с нуля на Python.
Autodesk в своём редакторе 3D-анимации Maya с помощью Python создаёт мультипликацию. Так же язык использует студия Pixar.
JPMorgan Chase, крупный американский финансовый холдинг, применяет Python для прогнозирования рынка.
NASA работает с проектами на этом языке программирования, чтобы проводить научные вычисления.
В этом списке собрана лишь незначительная часть компаний и сервисов, которые работают с Python. В их числе также Mail.ru, Яндекс, Yahoo, Facebook, Dropbox, Quora и многие другие. Все эти компании и сервисы нуждаются в хороших Python-разработчиках. Можно быть уверенными, что спрос на специалистов не упадёт в ближайшие несколько лет и будет стабильно расти.
Модули, библиотеки, import
Язык Python хорош тем, что в него встроено большое количество модулей и библиотек по умолчанию. Более того, их можно дополнительно установить из официального репозитория при помощи команды «pip install название_модуля» в терминале проекта.
Модули (один файл) и библиотеки (несколько файлов с обязательным наличием документа __init__.py) расширяют возможности программистов и упрощают работу. Не нужно создавать велосипед заново, так как его уже кто-то сделал ранее для вас. Нужно лишь им воспользоваться, чтобы добраться из точки А в точку Б.
В нашем коротком курсе мы рассмотрим абсолютный импорт и все его варианты. Имеется и относительный, но он понадобится позже, когда вы начнете разрабатывать сложные проекты.
Итак, в стандартном наборе модулей имеется random, используемый для работы со случайными числами и генерацией оных, выборкой рандомных значений и т.п. Дополнительных установок не потребуется.
Перечислим все способы абсолютного импортирования в Питоне:
Сначала указываем модуль, а потом функцию через точку.
Модуль указывать не требуется.
Модуль указывать не надо, но остальные его функции и переменные недоступны.
Строки
Строки в Python обособляются кавычками двойными «»» или одинарными «’». Внутри двойных ковычек могут присутствовать одинарные или наоборот. К примеру строка «Он сказал ‘привет’!» будет выведена на экран как «Он сказал ‘привет’!». Если нужно использовать строку из несколько строчек, то эту строку надо начинать и заканчивать тремя двойными кавычками «»»»». Вы можете подставить в шаблон строки элементы из кортежа или словаря. Знак процента «%» между строкой и кортежем, заменяет в строке символы «%s» на элемент кортежа. Словари позволяют вставлять в строку элемент под заданным индексом. Для этого надо использовать в строке конструкцию «%(индекс)s». В этом случае вместо «%(индекс)s» будет подставлено значение словаря под заданным индексом.
Синтаксис питона
Для того, чтобы было удобнее работать программистам с языком Python был придуман достаточно простой синтаксис. Приведу основные принципы.
- Конец строки обозначает завершение инструкции. Не нужно специально обозначать точкой с запятой или какими — то другими символами;
- Для того, чтобы отделить вложенные блоки друг от друга, используется отступ при помощи табуляции. Как правило, это четыре пробела;
- Основная инструкция заканчивается двоеточием. После нее под строкой располагается вложенная инструкция или блок с отступом в четыре пробела.
Есть еще некоторые специальные случаи, которые лучше рассмотреть отдельно.
Синтаксис
Во первых стоит отметить интересную особенность Python. Он не содержит операторных скобок (begin..end в pascal или {..}в Си), вместо этого блоки выделяются отступами: пробелами или табуляцией, а вход в блок из операторов осуществляется двоеточием. Однострочные комментарии начинаются со знака фунта «#», многострочные — начинаются и заканчиваются тремя двойными кавычками «»»»».
Чтобы присвоить значение пременной используется знак «=», а для сравнения —
«==». Для увеличения значения переменной, или добавления к строке используется оператор «+=», а для уменьшения — «-=». Все эти операции могут взаимодействовать с большинством типов, в том числе со строками. Например
Major new features of the 3.9 series, compared to 3.8
Some of the new major new features and changes in Python 3.9 are:
- PEP 573, Module State Access from C Extension Methods
- PEP 584, Union Operators in
- PEP 585, Type Hinting Generics In Standard Collections
- PEP 593, Flexible function and variable annotations
- PEP 602, Python adopts a stable annual release cadence
- PEP 614, Relaxing Grammar Restrictions On Decorators
- PEP 615, Support for the IANA Time Zone Database in the Standard Library
- PEP 616, String methods to remove prefixes and suffixes
- PEP 617, New PEG parser for CPython
- BPO 38379, garbage collection does not block on resurrected objects;
- BPO 38692, os.pidfd_open added that allows process management without races and signals;
- BPO 39926, Unicode support updated to version 13.0.0;
- BPO 1635741, when Python is initialized multiple times in the same process, it does not leak memory anymore;
- A number of Python builtins (range, tuple, set, frozenset, list, dict) are now sped up using PEP 590 vectorcall;
- A number of Python modules (_abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time, _weakref) now use multiphase initialization as defined by PEP 489;
- A number of standard library modules (audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib) are now using the stable ABI defined by PEP 384.
You can find a more comprehensive list in this release’s «What’s New» document.
Сравнение при помощи оператора != переменных одного и двух типов
Наш первый пример будет содержать различные способы сравнения двух или более значений переменных разных типов с помощью оператора неравенства.
Мы инициализируем две целочисленные переменные, и . После этого используем знак для сравнения их значений. Результат в виде булева значения будет сохранен в новой переменной . После этого мы выводим значение этой переменной.
x = 5 y = 5 c = x != y print(c) # False
При выполнении этого кода мы получим результат , потому что значения переменных и были равны и имели одинаковый тип данных.
Теперь давайте обновим наш код. Мы объявим три разные переменные, причем только две из них будут иметь одинаковое значение.
После этого мы воспользуемся оператором неравенства , чтобы получить результат сравнения переменных и . В этом случае мы используем оператор неравенства прямо в предложении .
Затем мы сравним переменные и вне предложения print и запишем результат в переменную . После этого используем значение этой переменной в print.
Наконец, мы объявим переменную строкового типа и сравним ее с целочисленной переменной a в предложении print.
a = 3 b = 3 c = 2 print(f'a is not equal to b = {a!= b}') # a is not equal to b = False f = a != c print(f"a is not equal to c = {f}") # a is not equal to c = True q = '3' print(f'a is not equal to q = {a!= q}') # a is not equal to q = True
В выводе мы видим одно ложное и два истинных значения. Первые два результата мы получили, сравнивая переменные целочисленного типа. Однако последнее сравнение было между переменными целочисленного и строкового типов. И хотя обе переменные были равны 3, одна из них была строковой, а вторая – целочисленной. Поэтому мы получили , значения не равны.
Логический оператор AND в Python
Вот простой пример логического оператора and.
x = 10 y = 20 if x > 0 and y > 0: print('Both x and y are positive numbers')
Вывод: и x, и y – положительные числа.
Перед выполнением логической операции выражения оцениваются. Таким образом, приведенное выше условие if аналогично приведенному ниже:
if (x > 0) and (y > 0): print('Both x and y are positive numbers')
В Python каждая переменная или объект имеет логическое значение.
if x and y: print('Both x and y have boolean value as True')
Вывод: И x, и y имеют логическое значение True, потому что функция len() ‘x’ и ‘y’ вернет 2, т.е.> 0.
Давайте подтвердим приведенное выше утверждение, определив настраиваемый объект. Python использует функцию __bool __() для получения логического значения объекта.
class Data: id = 0 def __init__(self, i): self.id = i def __bool__(self): print('Data bool method called') return True if self.id > 0 else False d1 = Data(-10) d2 = Data(10) if d1 and d2: print('Both d1 and d2 ids are positive') else: print('Both d1 and d2 ids are not positive')
Вывод:
Data bool method called At least one of d1 and d2 ids is negative
Обратите внимание, что функция __bool __() вызывается только один раз, что подтверждается выводом оператора печати. На диаграмме ниже изображена логическая блок-схема и схема работы
На диаграмме ниже изображена логическая блок-схема и схема работы.
Major new features of the 3.9 series, compared to 3.8
Some of the new major new features and changes in Python 3.9 are:
- PEP 573, Module State Access from C Extension Methods
- PEP 584, Union Operators in
- PEP 585, Type Hinting Generics In Standard Collections
- PEP 593, Flexible function and variable annotations
- PEP 602, Python adopts a stable annual release cadence
- PEP 614, Relaxing Grammar Restrictions On Decorators
- PEP 615, Support for the IANA Time Zone Database in the Standard Library
- PEP 616, String methods to remove prefixes and suffixes
- PEP 617, New PEG parser for CPython
- BPO 38379, garbage collection does not block on resurrected objects;
- BPO 38692, os.pidfd_open added that allows process management without races and signals;
- BPO 39926, Unicode support updated to version 13.0.0;
- BPO 1635741, when Python is initialized multiple times in the same process, it does not leak memory anymore;
- A number of Python builtins (range, tuple, set, frozenset, list, dict) are now sped up using PEP 590 vectorcall;
- A number of Python modules (_abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time, _weakref) now use multiphase initialization as defined by PEP 489;
- A number of standard library modules (audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib) are now using the stable ABI defined by PEP 384.
You can find a more comprehensive list in this release’s «What’s New» document.
Рекомендации по ФП на языке Python
Понятие ФП несколько различается по строгости формулировки. Одни понимают применение только функций, немутируемость и наведение мостов с периферией (вводом-выводом). Другие определяют ФП строже и наряду с немутируемостью говорят о применении только чистых функций. Но в любом случае программирование в функциональном стиле не тождественно функциональному программированию. Применение первоклассных функций, лямбд, итераторов, включений, каррирования и сопоставления с шаблонами вовсе не означает немутируемость и чистые функции.
Что делает функции нечистыми?
-
Глобальные мутации, т.е. внесение изменений в глобальное состояние,
-
Недетерминированность функций, т.е. которые для одинаковых входных значений могут возвращать разные результаты, и
-
Операции ввода-вывода.
Пример глобальной мутации:
Пример недетерминированности:
Пример операции ввода-вывода:
Из чистых функций вытекает ссылочная (референциальная) прозрачность. Говорят, что программа или математическое выражение ссылочно прозрачны, если любое подвыражение можно заменить его значением, и это не приведет к изменению значения целого, т. е. скрытые побочные эффекты отсутствуют. Математические рассуждения, преобразования и доказательства корректности могут быть справедливыми только для выражений, обладающих этим свойством. А программы, написанные на обычных императивных языках, не являются ссылочно прозрачными, так как присваивание значений глобальным переменным, в некоторых случаях и локальным, вызывает скрытые побочные эффекты.
Ссылочная прозрачность (1) улучшает тестопригодность программ, т.е. поведение подпрограмм не зависит от контекста, повторный запуск приложения дает одинаковый результаты как следствие отсутствия мутаций, (2) обеспечивается модульность, т.е. поведение функций не зависит от контекста, и чистые функции можно легко составлять в композиции, строя новые формы поведений, (3) упрощает обеспечение конкурентности из-за отсутствия необходимости в синхронизации, т.к. отсутствие совместных мутируемых данных делает синхронизацию ненужной.
Однако, ФП имеет свои недостатки, такие как новизна парадигмы и иногда ухудшение производительности программ. Но в нашем случае главный недостаток состоит в том, что язык Python, как таковой, не является языком функционального программирования. Например, в нем нет библиотеки по работе с неизменяемыми структурами данных и оптимизации стека под хвостовую рекурсию. Однако эффективное функциональное программирование на Python вполне возможно.
В отличие от объектно-ориентированного программирования, которое строит сложные формы поведения с помощью наследования, ФП опирается на композицию функций. Этот принцип перекликается с философией Unix, состоящей из 2 правил:
-
Правило композиции — строить программы так, чтобы иметь возможность легко их соединять с другими программами.
-
Правило модульности — писать простые части, которые можно соединять чистыми интерфейсами.
Указанные выше два простых правила делают ненужными архитектурные шаблоны и принципы ООП, заменяя их функциями! А что, спросите вы, и классы тоже? В Python использование классов не противоречит ФП, если в них отсутствует мутирующие интерфейсы.
Пример класса с мутирующим интерфейсом:
Пример класса без мутирующего интерфейса:
Но лучше использовать замороженные dataclasses и копирование, где необходимо. Иными словами, все классы должны быть замороженными dataclasses.
При всем при этом dataclasses могут быть вполне себе умными!
Также следует использовать сторонние функциональные библиотеки (например, toolz), которые обеспечивают более оптимальную композиционность функций.
Как вариант, использовать декларативные включения в список, включения в словарь и включения в множество в качестве замены функций и , хотя эта рекомендация является факультативной.
И применять архитектурный шаблон «немутируемое ядро — мутируемая оболочка» (aka «функциональное ядро — императивная оболочка»), который позволяет выносить мутацию во вне и производить ее на границах приложения.
Переменные в Python
Любой язык программирования оперирует переменными. Это некие значения, которым мы дали имена. Их можно использовать любое количество раз в коде.
Пример плохих или неверных наименований:
- abswqw – не понятно, какой смысл у данной переменной;
- 12Q – имена не могут начинаться с цифры;
- myname – два слова, не отделенные нижним подчеркиванием;
- nomer_telefona – не нужно транслита, следует использовать английские слова, чтобы ваш код понял программист из любой точки планеты.
Правильные переменные:
- name – понятно и отражает суть;
- birth_year – используем змеиную нотацию.
Реализуем простую задачу для новичков на Питоне, которая иногда встречается на собеседованиях!
Получим от пользователя следующие сведения: его имя и страну, в которой бы он хотел побывать. Выведем на печать сообщение: «Доброго дня, {ИМЯ}. {СТРАНА} – интересная страна!». А после этого продемонстрируем пользователю еще одну фразу: «Было приятно с вами поболтать, {ИМЯ}».
Данный проект показывает не только умение начинающего работать с базовыми возможностями языка, но и демонстрирует его умение пользоваться переменными.
Чтобы передать в функцию print переменную вместе с текстом, удобно пользоваться так называемыми f-строками. Синтаксис следующий: print(f’Вы передали переменную {variable}’).
Как видим, переменная может использоваться в разных участках кода после того, как ей присвоено значение.
2.2. The Interpreter and Its Environment¶
2.2.1. Source Code Encoding
By default, Python source files are treated as encoded in UTF-8. In that
encoding, characters of most languages in the world can be used simultaneously
in string literals, identifiers and comments — although the standard library
only uses ASCII characters for identifiers, a convention that any portable code
should follow. To display all these characters properly, your editor must
recognize that the file is UTF-8, and it must use a font that supports all the
characters in the file.
To declare an encoding other than the default one, a special comment line
should be added as the first line of the file. The syntax is as follows:
# -*- coding: encoding -*-
where encoding is one of the valid supported by Python.
For example, to declare that Windows-1252 encoding is to be used, the first
line of your source code file should be:
# -*- coding: cp1252 -*-
One exception to the first line rule is when the source code starts with a
. In this case, the encoding
declaration should be added as the second line of the file. For example:
#!/usr/bin/env python3 # -*- coding: cp1252 -*-
Footnotes
-
On Unix, the Python 3.x interpreter is by default not installed with the
executable named , so that it does not conflict with a
simultaneously installed Python 2.x executable.
Включение в последовательность
Операции отображения и фильтрации встречаются так часто, что во многих языках программирования предлагаются способы написания этих выражений в более простых формах. Например, в языке Python возвести список чисел в квадрат можно следующим образом:
Python поддерживает концепцию под названием «включение в последовательность» (от англ. comprehension, в информатике эта операция так же называется описанием последовательности), которая суть изящный способ преобразования одной последовательности в другую. Во время этого процесса элементы могут быть условно включены и преобразованы заданной функцией. Вот один из вариантов общего формата операции включения в список:
В данном общем формате выражение – это выражение или функция с участием переменной, которые возвращают значение, переменная – это элемент последовательности, список – это обрабатываемый список, и выражение2 – это логическое выражение или предикативная функция с участием переменной. Чтобы все стало понятно, приведем простой пример возведения список в квадрат без условия:
Приведенное выше включение в список эквивалентно следующему ниже фрагменту программного кода:
Такая форма записи называется синтаксическим сахаром, т.е. добавленная синтаксическая конструкция, позволяющая записывать выражения в более простых и кратких формах. Неплохой аспект конструкций включения в последовательность состоит еще и в том, что они легко читаются на обычном языке, благодаря чему программный код становится чрезвычайно понятным.
В конструкции включения в последовательность используется математическая запись построения последовательности. Такая запись в теории множеств и логике называется определением интенсионала множества и описывает множество путем определения условия, которое должно выполняться для всех его членов. В сущности, в терминах этих областей науки, выполняя данную операцию в Python, мы «описываем интенсионал» соответственно списка, словаря, множества и итерируемой последовательности. Ниже приведены примеры описания интенсионала соответственно списка, словаря, множества и итерируемой последовательности.
Таблица 1. Формы описания интенсионала
Выражение |
Описание |
Описание списка |
|
Описание словаря |
|
Описание множества |
|
Описание последовательности. Такая форма записи создает генератор последовательности. Генератор – это объект, который можно последовательно обойти (обычно при помощи инструкции ), но чьи значения предоставляются только тогда, когда они требуются, используя ленивое вычисление. |
Отметим, что приведенные в таблице выражения (за исключением описания словаря) отличаются только ограничивающими символами: квадратные скобки применяются для описания списка, фигурные скобки – для описания словаря или множества и круглые скобки – для описания итерируемой последовательности.
Таким образом, примеры из разделов о функциях и легко можно переписать с использованием включения в последовательность. Например, в строке 3 приведенного ниже интерактивного сеанса вместо функции применена операция включения в список:
Обратите внимание на квадратные скобки в определении – они сигнализируют, что в результате этой операции будет создан список. Также стоит обратить внимание, что при использовании в данной конструкции нескольких последовательностей применяется встроенная функция , которая в данном случае объединяет соответствующие элементы каждой последовательности в двухэлементные кортежи
(Если бы последовательностей было три, то они объединялись бы в кортежи из трех элементов и т.д.)
Включение в список применено и в приведенном ниже примере вместо функции :
Квадратные скобки в определении сигнализируют, что в результате этой операции будет создан список. Какой способ обработки последовательностей применять – с использованием функций более высокого порядка или включений, зачастую является предметом личных предпочтений.
Что такое виртуальные среды или окружения языка Python?
Иногда при написании приложений возникают трудности, которые связаны с применением разных версий библиотек. Могут различаться требуемые версии, бывает нельзя изменять и обновлять библиотеки, также библиотеки могут быть недоступны.
Для того, чтобы эти проблемы не возникали были придуманы виртуальные среды или окружения. В каждой виртуальной среде можно запускать свое приложение с набором библиотек. Изменение или обновление этих библиотек не влияет на остальные приложения также использующие эти библиотеки.
Существует программное обеспечение, позволяющее формировать виртуальное окружение. Оно бывает встроенное в Python и внешнее. В стандартную библиотеку Python 3 входит модуль venv.