Что делает символ в python
Перейти к содержимому

Что делает символ в python

  • автор:

Введение [ править ]

Настоящее справочное руководство описывает синтаксис и «ядро» семантики языка Python. Руководство является кратким, но мы попытались сделать его точным и полным. Семантика несущественных встроенных типов объектов, а также встроенных функций и модулей описана в Стандартной Библиотеке Python. Для неофициального введения в язык, см. Учебник Python 3.1. Для программистов на C или C++, существуют два дополнительных руководства: Расширение и Включение интерпретатора Python представляет высокоуровневое описание того, как создать модуль расширения Python, а Справочное Руководство Python/C API подробно описывает интерфейсы, доступные для программистов на C/C ++.

Содержание

Это справочное руководство описывает язык программирования Python. Оно не является учебником по программированию.

В то время как я пытаюсь быть настолько точным насколько возможно, я хотел использовать английские а не формальные спецификации для всего кроме синтаксиса и лексического анализа. Это должно сделать документ более понятным обычным читателям, но оставляет простор для двусмысленностей. Следовательно, если Вы прибыли с Марса и пробуете заново изобрести Python на основе одного только этого документа, Вам, возможно, придется угадывать некторые вещи, и фактически Вы вероятно закончите тем, что создадите совершенно иной язык программирования. С другой стороны, если Вы используете Python и интересуетесь тем, каковы точные правила для какой-либо области языка, Вы определенно должны найти их здесь. Если Вы хотели бы видеть более формальное определение языка, возможно Вы могли бы добровольно потратить свое время — или изобрести машину для клонирования :-).

Опасно добавлять слишком много подробностей реализации в справочник по языку программирования — реализация может измениться, и другие реализации того же самого языка могут работать иначе. С другой стороны, CPython — одна из реализаций Python, широко используется (хотя дополнительные реализации продолжают поддерживаться), и ее специфические причуды иногда стоят упоминания, особенно тогда, когда реализация налагает дополнительные ограничения. Поэтому Вы найдете короткие “примечания по реализации” разбросанными по всему тексту.

Каждая реализация Python поставляется со множеством встроенных и стандартных модулей. Они описываются Стандартной Библиотеке Python. Некоторые из этих встроенных модулей упоминаются в том случае, когда они существенно зависимы от определений самого языка.

Альтернативные реализации [ править ]

Несмотря на то, что одна из реализаций Python является самой популярной, существует также несколько других реализаций, которые могут быть интересны различным группам пользователей.

Среди прочих наиболее известны следующие реализации:

  • CPython

Это оригинальная и наиболее поддерживаемая реализация Python, написанная на C. Новые возможности языка первыми появляются, как правило, именно в ней.

  • Jython

Python, написанный на Java. Эта реализация может быть использована, как скриптовый язык для Java приложений, или же для создания приложений с применением библиотек классов Java. Jython также часто применяется для написания тестов для библиотек Java. Более подробную информацию можно найти на сайте Jython.

  • Python for .NET

Данная реализация в действительности основана на CPython, но является управляемым .NET приложением и предоставляет доступ к библиотекам .NET. Она была создана Брайаном Ллойдом (Brian Lloyd). Более подробную информацию Вы можете найти на сайте Python for .NET.

  • IronPython

Альтернативная реализация Python for .NET. В отличие от Python.NET, это целостная реализация Python, генерирующая IL, и компилирующая программы на Python непосредственно в сборки .NET. Она была создана Джимом Хугунин (Jim Hugunin), создателем Jython. Более подробную информацию Вы можете найти на сайте IronPython.

  • PyPy

Реализация Python написанная на Python; даже интерпретатор байт-кода написан на Python. Это достигается с помощью CPython и интерпретатора более низкого уровня. Одной из целей этого проекта стало поощрение экспериментов с самим языком путем упрощения изменения интерпретатора (для чего он и был тоже написан на Python). Более подробную информацию Вы можете найти на домашней странице проекта PyPy.

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

Нотация [ править ]

В описаниях лексического анализа и синтаксиса используется модифицированная грамматическая нотация BNF. Применяется следующий стиль определений:

В первой строке указано, что name — это lc_letter за которым идет последовательность из нуля или более lc_letter и знаков подчеркивания. lc_letter в свою очередь — это любой символ от ‘a’ до ‘z’. (Это правило соблюдается «де-факто» в лексических и грамматических правилах настоящего документа.)

Каждое правило начинается с имени (которое является именем, определенным правилом), и символов «:: =». Вертикальный штрих (|) используется, чтобы разделять альтернативы; это — наименее обязательный оператор в этой нотации. Звездочка (*) означает нуль или больше повторений предыдущего элемента; аналогично, плюс (+) означает одно или более повторений, а фраза, заключенная в квадратные скобки ([ ]) означает нуль или более повторов вхождения (другими словами, заключенная в них фраза является опциональной). «*» и «+» операторы связаны настолько сильно насколько возможно; круглые скобки используются для группировки. Литеральные строки заключаются в кавычки. Пустое пространство также является значимым для разделения лексемм. Правила обычно заданы в одной строке; правила со многими альтернативами могут быть отформатированы иначе — каждая следующая строка после первой начинается с вертикального штриха.

В лексических определениях (таких, как в примере выше), используются два дополнительных соглашения: Два буквенных символа разделенные тремя точками означают выбор одного символа из заданного этим выражением диапазона (включающего два вышеуказанных символа) ASCII символов. Фраза, заключенная в угловые скобки (<. >) дает неформальное описание заданного символа; например это может использоваться для описания значения ‘управляющих символов’, если таковое описание необходимо.

Даже если используемая нотация почти одинакова, есть значительная разница между значением лексических и синтаксических определений: лексические определения оперируют отдельными символами их источника ввода, тогда как синтаксические определения оперируют потоком токенов, генерируемых лексическим анализатором. Все определения BNF в следующей главе («Лексический анализ») это лексические определения; использующиеся в последующих главах — синтаксические определения.

Лексический анализ [ править ]

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

Python считывает текст программы как символы в формате Unicode; кодировка символов может быть задана декларацией кодировки, по умолчанию она считается UTF-8, более подробно см. PEP 3120. Если файл с исходным кодом не может быть декодирован, генерируется ошибка синтаксиса.

Структура строки [ править ]

Программа на Python состоит из логических строк.

Логические строки [ править ]

Конец логической строки определяется токеном NEWLINE. Декларации не могут выходить за рамки границ логической строки, кроме тех случаев, когда NEWLINE допустима в синтаксисе (напр., между отдельными декларациями в составных декларациях). Логическая строка составляется из одной или большего количества физических строк с учетом явных или неявных правил объединения физических строк.

Физические строки [ править ]

Физические строки — это последовательности символов, оканчивающиеся последовательностью конца строки. В исходных файлах могут использоваться стандартные для разных вычислительных платформ последовательности конца строки — в Unix ASCII символ перевода строки LF (linefeed), в Windows — последовательность ASCII символов CR LF (возврат каретки, за которым стоит символ перевода строки), или использовавшийся ранее на Macintosh символ перевода каретки CR (return). Любой из этих вариантов может использоваться равноправно, вне зависимости от текущей вычислительной платформы.

При отдельном использовании Python, строки исходного кода должны передаваться в Python API с использованием стандартных соглашений языка C для символов перевода строки (символ \n, представляющий ASCII LF, является признаком конца строки).

Комментарии [ править ]

Комментарий начинается с символа «решетка» (#), который не является частью строки, и заканчивается концом физической строки. Комментарий является также концом строки, кроме случаев неявного использования правила объединения строк. Комментарии игнорируются синтаксическим анализатором и не являются токенами.

Задание кодировки [ править ]

Если комментарий в первой или второй строке скрипта Python соответствует регулярному выражению coding[=:]\s*([-\w.]+), то этот комментарий обрабатываться как объявление кодировки; первая группа этого выражения задает кодировку исходного текста. Рекомендуемые формы этого выражения:

которая также распознается GNU Emacs, и

которая распознается Bram Moolenaar’s VIM.

Если объявление кодировки не было найдено, то по умолчанию используется кодировка UTF-8. Кроме того, если первые байты файла являются UTF-8 byte-order mark (b’\xef\xbb\xbf’), то для файла выбирается кодировка UTF-8 (это поддерживается, среди прочего, блокнотом от Microsoft).

Если кодировка задана, то название кодировки должно быть распознано Python. Кодировка используется на этапе лексического анализа, в том числе для последовательностей символов (строк), комментарии и идентификаторы. Название кодировки должно содержаться в той же строке, в которой происходит задание кодировки.

2.1.5. Явное объединение строк [ править ]

Две или более физических строк могут быть объединены в одну условную строку при помощи символа бэкслэш (\) следующим образом: когда строка заканчивается бэкслэшем, не являющимся частью текстовых данных или комментария, она объединяется со следующей, составляя единую условную строку, не включающую бэкслэш и следующий за ним символ окончания строки. Например:

Строка, оканчивающаяся бэкслэшем, не может содержать комментарий. Комментарий или другую лексему кроме текстовых данных, начатые на одной строке, нельзя продолжить с помощью бэкслэша на другой строке. Кроме конца физической строки бэкслэш допустим только внутри текстовых данных.

2.1.6. Неявное объединение строк [ править ]

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

Неявно продолженные строки могут содержать комментарии. Отступы не играют роли в продолженных строках. При продолжении разрешены пустые строки. Лексемы NEWLINE не должно быть в неявно продолженных строках. Строки в тройных кавычках (см. ниже) также могут быть неявно продолженными, в этом случае они не могут содержать комментарий.

2.1.7. Пустые строки [ править ]

Условные строки, содержащие только пробелы, знаки табуляции или перевода страницы и комментарии игнорируется (т.е. не создается лексемы NEWLINE). Во время интерактивного ввода операторов обработка пустой последовательности может отличаться в зависимости от реализации цикла чтение-вычисление-вывод. В стандартном интерактивном интерпретаторе полностью пустая условная строка (т.е. не содержащая даже пробел или комментарий) завершает многострочный оператор.

2.1.8. Отступы [ править ]

Знаки пробела и табуляции, начинающие условную строку, используются для вычисления уровня отступа строки, который, в свою очередь, определяет группировку операторов.

Знаки табуляции заменяются (слева напрво) по одному на восемь пробелов так, что общее число символов после замены кратно восьми (здесь использовано то же правило, что и в Unix). Общее число знаков перед первым непустым символом определяет отступ строки. Отступ не может быть разделен между многими физическими строками с помощью бэкслэша; знаки пробела и табуляции до первого бэкслэша определяют отступ.

Отступы не принимаются из-за противоречивости, если исходный файл смешивает табуляции и пробелы таким образом, что делает смысл зависящим от размера табуляции в пробелах; в таком случае генерируется «TabError» .

Замечание о кроссплатформенной совместимости: из-за особенностей текстовых редакторов на не-UNIX платформах — не следует использовать смесь пробелов и табуляций для отступов в одном исходном файле. Также следует отметить, что различные платформы могут явно ограничивать максимальный уровень отступов.

Символ перевода страницы (formfeed) может находится в начале строки, тогда он игнорируется при расчете отступов. В любом другом месте символ перевода страницы между пробелами в начале строки может обрабатываться неопределенным образом (например, может сбрасывать счетчик предыдущих пробелов до нуля).

Уровни отступа строк используются для создания лексем INDENT (отступ) и DEDENT (конец отступа) при помощи стека, как описано ниже.

Перед чтением первой строки файла в стек записывается значение «0», это значение никогда не будет извлечено. Числа, заносимые в стек, будут строго возрастать. В начале каждой условной строки уровень отступа сравнивается с максимальным значением на верху стека; если они равны, то ничего не происходит. Если уровень отступа больше, то он заносится в стек, и создается одна лексема «INDENT». Если уровень меньше, то это число уже должно быть в стеке; все числа, которые больше, удаляются, и для каждого удаленного числа создается лексема «DEDENT» . В конце файла лексемы «DEDENT» создаются для всех оставшихся в стеке чисел больше нуля.

Здесь приведен пример кода на Питоне с правильно (но странновато) расставленными отступами:

Следующий пример показывает различные ошибки в отступах:

(Вообще-то, первые три ошибки найдены парсером, и только последняя — лексическим анализатором: уровень отступа return r не совпадает с уровнем в стеке.)

2.1.9. Пробелы между лексемами [ править ]

Кроме начала логической строки или в записи текстовых данных символы пробела, табуляции и перевода страницы могут быть взаимозаменяемы при разделении лексем. Эти символы необходимы между двумя лексемами только, если результат их объединения может быть интерпретирован как другая лексема (например : «ab» — это одна лексема, но «a b» — две лексемы) .

2.2. Другие лексемы [ править ]

Кроме «NEWLINE» , «INDENT» и «DEDENT» , существуют следующие категории лексем: идентификаторы, ключевые слова, литералы (непосредственная запись данных) , операторы и разделители. Символы пробелов (кроме знаков конца строки, описанных ранее) не являются лексемами, а служат для их разделения. Если появляется неопределенность, лексема включает самую длинную возможную последовательность, представляющую собой действительную лексему (чтение происходит слева направо) .

2.3. Идентификаторы и ключевые слова [ править ]

Идентификаторы (имена) имеют следующее лексическое определение.

Синтаксис идентификаторов в Питоне основывается на приложении «UAX-31» к стандарту «Unicode» , с переработкой и изменениями описанными ниже. Также смотрите дополнительные детали в «PEP 3131» .

В ASCII диапазоне (U+0001..U+007F) в идентификаторах допустимы только те же символы, что и в Питоне 2.x : буквы от «A» до «Z» в верхнем и нижнем регистре, подчеркивание «_» и, кроме первого символа идентификатора, – цифры от «0» до «9» .

В Питоне 3.0 введены дополнительные символы, не входящие в ASCII диапазон (см. «PEP 3131») . Для этих символов использована классификация из версии базы символов Unicode (Unicode Character Database), включенная в модуль «unicodedata» .

Идентификаторы не ограничены по длине и чувствительны к регистру.

Использованные выше обозначения категорий Юникода :

  • Lu — буквы в верхнем регистре
  • Ll — буквы в нижнем регистре
  • Lt — Заглавные буквы
  • Lm — модифицирующие символы
  • Lo — другие буквы
  • Nl — буквенные числа
  • Mn — непробельные знаки
  • Mc — пробельные составные знаки
  • Nd — десятичные цифры
  • Pc — пунктуационные знаки

Все идентификаторы при лексическом разборе конвертируются в нормализованную форму NFC; и сравнение идентификаторов производится уже в форме NFC.

Ненормативный HTML файл со списком всех символов Юникода 4.1 , доступных для использования в идентификаторах, представлен здесь: http://www.dcl.hpi.uni-potsdam.de/home/loewis/table-3131.html .

2.3.1. Ключевые слова [ править ]

Следующие идентификаторы являются зарезервированными или ключевыми словами языка и не могут быть использованы как обычные идентификаторы. Они должны быть написаны именно так, как здесь:

2.3.2. Зарезервированные классы идентификаторов [ править ]

Определенные классы идентификаторов (помимо ключевых слов) имеют особое значение. Эти классы определяются соответствующей комбинацией символов подчеркивания в начале и в конце.

Не импортируются инструкцией «from module import *» . Специальный идентификатор «_» используется интерактивным интерпретатором для хранения результата последнего вычисления, хранится он в модуле «builtins» . Не в интерактивном режиме «_» не имеет специального значения, не определен. (Смотрите раздел «Объявление импорта» ) . Примечание: Имя «_» часто используется в связи с интернационализацией, смотрите документацию модуля «gettext» для получения информации по этой договоренности.

Определенные системой имена. Эти имена определяются интерпретатором и его реализацией (включая стандартную библиотеку). Приложения не должны определять дополнительные имена используя эту форму. Набор имен этого класса, определенных в Питоне, может быть расширен в будущих версиях. Смотрите раздел «Имена специальных методов» .

Частные имена класса. Имена этой категории, при использовании в рамках определения класса, автоматически модифицируются, чтобы избежать конфликтов имен между «частными» атрибутами базовых и производных классов. Смотрите в разделе «Идентификаторы (Имена)» .

2.4. «Литералы» [ править ]

«Литералы» — это непосредственная запись постоянных значений некоторых встроенных типов.

2.4.1. Текстовые («String») и байтовые («Bytes») «литералы» [ править ]

Непосредственная запись текстовых данных имеет следующее лексическое определение:

Есть также одно синтаксическое ограничение, не отмеченное в этих определениях: знаки пробелов (пробела, табуляции, перевода страницы) не могут находится между строковым или байтовым префиксом и остальной частью «литерала» . Набор символов кода программы определяется объявлением кодировки, по умолчанию: UTF-8, смотрите раздел «Объявление кодировки» .

Говоря проще : оба типа «литералов» обрамляются с двух сторон одинаковыми кавычками : или по одной одинарной «’» , или по одной двойной «»» , или по три одинарных «’ ‘ ‘» , или по три двойных «»»»» (утроенные кавычки) . Символ бэкслэш «\» используется для «экранирования» (вставки в качестве простых печатных) символов, которые в других случаях имеют особое значение, такие как знак новой строки, сам бэкслэш или кавычки.

Строковые литералы могут опционально начинаться с букв «r» или «R» ; такие строки называются «сырыми» («raw»), и считают бэкслэш обычным символом. В результате последовательности «\U» и «\u» специального значения в «сырых» строках не имеют.

Байтовым «литералам» должен предшествовать префикс «b» или «B» . Они создают экземпляр типа «bytes» вместо типа «str» . Этот тип может содержать только символы ASCII; байты с численным значением больше 127 записываются с помощью особых последовательностей символов.

В текстовых данных в утроенных кавычках – могут присутствовать (и сохраняются как есть) «неэкранированные» знаки новой строки и кавычки (не в виде специальных последовательностей) , кроме трех «неэкранированных» кавычек подряд (того же вида, как и открывавшие), которые завершают запись текста.

Если нет префикса «r» или «R» , специальные последовательности в строках интерпретируются согласно правилам стандартного «C» . Опознаются следующие специальные последовательности:

спец.
последовательность
значение примечание
\newline и бэкслэш и символ
новой строки отбрасываются
\\ бэкслэш (\)
\’ одинарная кавычка (‘)
двойная кавычка («)
\a ASCII Bell (BEL)
\b ASCII Backspace (BS)
\f ASCII Formfeed (FF)
\n ASCII Linefeed (LF)
\r ASCII Carriage Return (CR)
\t ASCII Horizontal Tab (TAB)
\v ASCII Vertical Tab (VT)
\ooo символ с 8-ричным
значением ooo
(1,3)
\xhh символ с 16-ричным
значением hh
(2,3)

Следующие специальные последовательности опознаются только в текстовых данных:

спец.
последовательность
значение примечание
\N

Символ с именем name в базе Unicode
\uxxxx Символ с 16-битным
16-ричным значением xxxx
(4)
\Uxxxxxxxx Символ с 32-битным
16-ричным значением xxxxxxxx
(5)

1. Как и в стандартном «C» , принимается до трех восьмеричных знаков. 2. В отличие от стандартного «C» , принимается строго два 16-ричных знака. 3. В байтовых данных 16- и 8-ричные специальные последовательности обозначают байт с данным значением. В текстовых данных они обозначают символ Юникода с данным кодом. 4. Отдельные коды, составляющие части суррогатной пары, могут быть закодированы при помощи специальных последовательностей. В отличие от стандартного «C» , требуется строго два 16-ричных знака. 5. Этим способом могут быть закодированы любые символы Юникода, но символы вне «Basic Multilingual Plane» (BMP) будут закодированы с помощью суррогатной пары, если Питон скомпилирован под использование 16-битных элементов кода Юникод (по умолчанию). Отдельные коды, составляющие части суррогатной пары, могут быть закодированы при помощи специальных последовательностей.

В отличие от стандартного «C» , все неопознанные последовательности символов оставляются в тексте неизменными, т. е. бэкслэш остается в тексте. (Такое поведение полезно при отладке: если особая последовательность символов написана неправильно, то в том, что появляется на выходе легче заметить ошибку.) Кроме того, важно отметить, что управляющие последовательности опознающиеся только в записи текста попадают в категорию неопознанных последовательностей в записи байтовых данных.

Даже в «сыром» тексте кавычки могут быть вставлены через бэкслэш, но бэкслэш остается в строке, например, «r»\»»»является верной текстовой записью, состоящей из двух символов: бэкслэш и двойные кавычки; «r»\»» не является допустимой записью (даже «сырой» текст не может заканчиваться нечётным количеством бэкслэшей). В частности, «сырой» текст не может оканчиваться одним бэкслэшем (поскольку бэкслэш превращает следующую за ним кавычку в текст). Отметьте также, что один бэкслэш подряд, за которым сразу следует переход на новую строку интерпретируется как эти два символа, являющиеся частью строки, а не как продолжение строки.

2.4.2. Соединение текстовых записей (литералов) [ править ]

Допустимы несколько идущих подряд текстовых записей, разделённых пробелами (возможно, с использованием разных типов пар кавычек) — их значение эквивалентно значению одной текстовой записи, являющейся их соединением. Таким образом, «»hello» ‘world’» эквивалентно «»helloworld»» . Эта особенность позволяет уменьшать количество необходимых бэкслэшей, удобно разделять длинные тексты на много физических строк, или даже добавлять комментарии к отдельным фрагментам текста, например:

Обратите внимание, что это свойство определено на синтаксическом уровне, но реализуется во время компиляции. Для соединения фрагментов текста во время исполнения – должен использоваться оператор «+» . Заметьте также, что при соединении текста могут использоваться различные стили оформления для каждого фрагмента (даже смешивание «сырого» текста и в тройных кавычках) .

2.4.3. Непосредственная запись чисел [ править ]

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

Заметьте, что знак не является частью записи числа — такая формулировка, как «-1» , на самом деле является выражением, состоящим из унарного оператора «-» и числа «1» .

2.4.4. Запись целых чисел [ править ]

Запись целых чисел имеет следующее лексическое определение:

Нет ограничения длины записи числа, кроме размера доступной памяти.

Обратите внимание, что нули в начале ненулевого десятичного числа не допускаются. Это сделано для отличения их от восьмеричной записи в стиле «C» , которая использовалась в Питоне до версии 3.0 .

Некоторые примеры записи целых чисел:

2.4.5. Запись дробных чисел (с плавающей запятой) [ править ]

Запись дробных чисел имеет следующее лексическое определение:

Заметьте, что в целой и экспонентной частях всегда подразумевается основание «десять» . Например, «077e010» является допустимым и означает то же, что и «77e10» . Допустимый диапазон дробных чисел может различаться в разных реализациях. Примеры записи дробных чисел:

Заметьте, что знак не является частью записи числа — такая формулировка, как «-1» , на самом деле является выражением, состоящим из унарного оператора «-» и числа «1» .

2.4.6. Запись мнимых чисел [ править ]

Запись мнимых чисел имеет следующее лексическое определение:

Под мнимое число отводится комплексное число с действительной частью «0» . Комплексные числа представлены в виде пары чисел с плавающей точкой, которые имеют обычные ограничения диапазона их значений. Чтобы создать комплексное число с ненулевой действительной частью, нужно сложить обычное дробное число с мнимым числом, например, «(3 + 4j)» . Некоторые примеры записи мнимых чисел:

2.5. Операторы [ править ]

Следующие лексемы являются операторами:

2.6. Разделители [ править ]

Следующие лексемы выполняют роль грамматических разделителей:

Точка также используется в записи дробных и мнимых чисел. Последовательность из трех точек имеет особое значение — обозначение пропуска («ellipsis») . Вторая половина этого списка – расширенные операции присваивания – лексически являются разделителями, и одновременно выполняют операцию.

Следующие печатные символы ASCII имеют особое значение как часть других лексем, и, таким образом, важны для лексического анализатора:

Следующие печатные символы ASCII не используются в Питоне. Их появление за пределами записи текстовых данных или комментариев безусловно является ошибкой:

Операторы в Python от А до Я

Python – весьма перспективный язык программирования, который набирает популярность. Он позволяет создавать функциональный контент совершенно разного направления: от бизнес-софта до развлекательных утилит. Достаточно прост в изучении и освоении с нуля.

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

Немного терминологии

Python является язык общего назначения. Он включает в себя принципы объектно-ориентированного программирования. Поэтому перед тем, как изучать операторы и их нюансы, стоит запомнить несколько ключевых терминов. Без них создать качественное приложение не представляется возможным:

  1. Алгоритм – своеобразный набор правил и инструкций. Он необходим для обработки функций и выполнения тех или иных задач.
  2. API – интерфейс прикладного программирования. Включает в себя структурные данные, протоколы и правила, позволяющие быстро разрабатывать ПО, а также налаживать его взаимодействие с разного рода службами.
  3. Переменные – именованные ячейки памяти. Они резервируются системой с учетом типа используемых данных в исходном коде.
  4. Константа – постоянное значение. Оно не подлежит никаким корректировкам на протяжении всего жизненного цикла софта.
  5. Аргумент – значение, которое передается в команду или функцию.
  6. Объекты – наборы связанных между собой переменных, констант и иных структурных данных, выбираемых и обрабатываемых совместно.
  7. Классы – перечни связанных объектов. Наделяются общими свойствами.
  8. Итерация – один проход через команду или функцию в коде.

Отдельно стоит выделить такие понятия как «оператор» и «операнд». Первый термин указывает на объект, умеющий управлять операндами. Для этого задействуются специальные символы и записи (функции). Операнд – объект, которым можно манипулировать через так называемые операторы.

Основные операторы

Оператор в Питоне – символ, который будет отвечать за выполнение операции над одним или сразу несколькими операндами. Последним компонентом будет выступать переменная или значение, с которой требуется проводить дальнейшую работу.

Всего в рассматриваемом ЯП несколько типов операторов:

  • арифметические;
  • сравнения;
  • присваивания;
  • логические;
  • принадлежности;
  • битовые;
  • тождественные.

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

Арифметические

Арифметические операторы в Python – самые простые. Данная категория «команд» встречается даже новичкам. С ними знакомятся еще в школьной программе. Они отвечают за элементарные математические действия.

  1. Сложение (+). Производит сложение значений по обе стороны «команды».
  2. Вычитание (-). Осуществляет вычитание правой стороны из значения левой в заданном выражении.
  3. Умножение (*). Перемножает написанное с обеих сторон выражения.
  4. Деление (/). Делит левый операнд на правый. Тип информации результата – это число с плавающей точкой.
  5. Возведение в степень (**). Отвечает за возведение первого написанного числа в степень второго у заданной функции.
  6. Деление без остатка (//). Производит деление согласно установленным математическим правилам. После этого возвращает значение, оставляя только целочисленную часть от полученного частного. Все, что идет после десятичной точки, система отбросит.
  7. Остаток от деления (%). Эта операция также называется делением по модулю. При ее использовании происходит «раздел» и возврат значения остатка.

Все это должен знать даже школьник. А у разработчика подобная категория манипуляций вообще не вызывает никаких трудностей.

Сравнение

Операторы сравнения отвечают за проверку заданного в приложении равенства. Они указывают, каким является один из операндов:

  1. Меньше (<). True присваивается, если показатель слева меньше, чем справа.
  2. Больше (>). True на выходе будет получено, когда «условия» слева больше правого.
  3. Меньше или равно (<=). Выдает на выходе истину, если левая часть меньше или такая же, как правая.
  4. Больше или равно (>=). True устанавливается, если левая часть записи окажется больше или аналогичной правой.
  5. Равно (==). В данном случае происходит проверка на непосредственное равенство. Если параметр слева такой же, как справа, на выходе получится true. В противном случае – False.
  6. Не равно (!=). Оператор, который убран в Питоне 3. Он проверяет, не равен ли параметр слева правому. При успешном выполнении условия приложение выдаст True.

Здесь в основном придется учитывать результат в виде True и False. Перечисленные манипуляции тоже достаточно активно используются в разработке софта.

Присваивание

Операторы присваивания будут отвечать за передачу переменной того или иного значения. Тут нет true или false. Данная категория включает в себя:

  1. Обычное присваивание (=). Параметр справа передается левой части.
  2. Сложение и присваивание (+=). Суммирует параметры с обеих сторон и передает результат левой части.
  3. Вычитание и присваивание (-=). Из правого вычитается «левое». Далее последнему передается соответствующий результат.
  4. Деление и присваивание (/=).
  5. Умножение и присваивание (*=).
  6. Деление по модулю и присваивание (%=).
  7. Возведение в степень и присваивание (**=).
  8. Деление с остатком и присваивание (//=).

Последний является одним из самых важных в Питоне.

Логические операторы

Логические операторы выполняют роль своеобразных союзов. Они будут выдавать на выходе True или False. Дают возможность объединения нескольких условий в единое целое:

  1. И (and). Если написанное с двух сторон оператора – это true, то и все выражение окажется true.
  2. Или (or). Результат «ложь» выводится тогда, когда два операнда false. В противном случае – true.
  3. Не (not). Работает с булевыми значениями. True становится False. Обратное соотношение тоже действует.

Других логических операторов в рассматриваемом языке программирования нет.

Принадлежность

Зато есть операторы принадлежности. Они проверяют, является ли значение частью заданной последовательности: списка, кортежа, строки:

  1. В (in). Осуществляет проверку на принадлежность к последовательности. Возвращает True при соответствии указанному условию.
  2. Нет в (not in). Проводит проверку на НЕ принадлежность к последовательности.

Других операторов в данной категории нет.

Тождественность

Операторы тождественности проверяют, являются ли операнды одинаковыми. На практике встречаются не слишком часто:

  1. Это (is). Если тождественность есть, осуществляется возврат True.
  2. Это нет (is not).

Остается изучить последнюю крупную категорию операторов в Питоне.

Битовые операторы

Осуществляют работу над операндами побитово. Здесь можно увидеть:

  1. Бинарное И (&). Отвечает за побитовую операцию and.
  2. Или (|). Побитово проводит or.
  3. Или нет (^). Это – исключающее или (XOR).
  4. Инвертирующий оператор (

Теперь понятно, какие есть операнды и операции над ними в Питоне. А лучше изучить их на практике помогут компьютерные онлайн курсы.

Зачем Python столько знаков подчеркивания?

Maria Hladka

Знак подчеркивания “_” — не изобретение Python, другие языки программирования также используют символ “_” в своих сценариях; однако в семантике языка Python знак подчеркивания фигурирует особенно часто: первое, с чем сталкивается новичок в изучении объектно-ориентированного программирования на Python — это метод конструктора объекта __init__ , у которого в сигнатуре аж четыре подчеркивания!

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

В статье перечислены следующие приёмы разностороннего улучшения кода с помощью символа нижнего подчеркивания “_”:

  1. Создание временных переменных на Python.
  2. Улучшение читаемости кода на Python.
  3. Разрешение конфликта имён в программе на Python.
  4. Создание изолированных (внутренних, инкапсулированных, “приватных”) атрибутов для объектов Python.
  5. Создание защищенных от перезаписи атрибутов для объектов Python.
  6. Переопределение магических методов и специальных атрибутов объектов Python.

1. Временная переменная

Первый из приемов использования символа нижнего подчеркивания связан со временной переменной. Когда нет надобности тратить время на придумывание названия для переменной ввиду её низкой значимости для программы, или же когда никак не удаётся понять, какой идентификатор подойдет для переменной лучше всего — будет неплохим решением указать для переменной идентификатор, полностью состоящий из одного знака нижнего подчеркивания.

Последний результат REPL

Аббревиатура REPL расшифровывается как “Read Evaluate Print Loop”, что в переводе означает “Чтение Оценка Печать Цикл”. Запуская что-либо в консоли Python, результат работы программы будет записан в REPL в виде переменной. У этой переменной нет имени, и в качестве идентификатора для неё как раз подойдет один знак нижнего подчеркивания.

Ознакомиться с крайне типичным примером получения сохраненных в REPL результатов выполнения программы можно при использовании среды Jupyter Notebook. Предположим, в первой ячейке вашего блокнота инициирован запуск чего-либо — это значит, что в последующей ячейке доступ к результату выполнения программного кода первой ячейки можно получить с помощью символа нижнего подчеркивания:

Однако следует помнить, что тип данных None не буферизируется, из-за чего значение переменной с идентификатором в виде одного символа нижнего подчеркивания НЕ заменяется на None , оставаясь равным результату вычислений самой первой ячейки, как в примере ниже.

Анонимная переменная

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

В приведенном выше примере фрагмент кода выполняется 10k раз подряд с помощью цикла for ; однако не имеет значение, какая сейчас итерация цикла, а потому в качестве идентификатора для переменной с номером итерации выбран одинарный символ нижнего подчеркивания.

Более того, большинство из популярных интегрированных средств разработки по умолчанию знакомы с “эмпирическим правилом” идентификатора-подчеркивания, поэтому переменная с таким идентификатором не проверяется на предмет использования в остальном коде программы; и наоборот, при назначении переменной в вышеописанном цикле for уникального идентификатора, некоторые инструменты интегрированной среды разработки могут начать выдавать разработчику предупреждение о том, что он случайно “определил переменную без её использования”.

Универсальный заполнитель

Еще одно распространенное использование символа нижнего подчеркивания в качестве идентификатора временной переменной — это создание заполнителя; зачастую такой приём используется для извлечения значений из кортежа, как в примере ниже.

Как показано на примере, в качестве значения переменной x присваивается значение первого из элементов кортежа. А вот вторая переменная игнорируется, поскольку идентификатор-подчёркивание без лишних слов даёт понять, что она используется в качестве “заполнителя”.

Также следует упомянуть о малоизвестном трюке, который заключается в совместном использовании символа звездочки с идентификатором-подчеркиванием ради создания переменной-“заполнителя” с несколькими значениями. Предположим, что обозначен кортеж с несколькими элементами, задача — получить из него значения первого и последнего элементов:

Теперь не имеет значения, сколько элементов содержится в кортеже — переменные x и z всегда будут ссылаться на значения первого и последнего из них.

2. Улучшение читаемости кода

Сейчас речь пойдет о гораздо более известном, чем предыдущий, приёме использования символа нижнего подчеркивания; тем не менее мы всё равно рассмотрим его, несмотря на широкую славу, потому что этот маленький трюк в значительной степени улучшает читаемость чисел в программе.

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

Кроме того, разрешается буквально поставить знак подчеркивания в любом случайном месте посреди числа без какого-либо влияния на результат выполнения программы:

3. Разрешение конфликта имён

Символ нижнего подчеркивания также используется многими разработчиками для избегания появления конфликтов в пространствах имён, при том что на уровне интерпретатора для такого использования подчеркивания нет никакого официального функционала. Таким образом, это еще одно “эмпирическое правило” использования символа нижнего подчеркивания в коде.

Например, необходимо определить функцию получения “класса” (разновидности) некоторых продуктов. Если написать код следующим образом, то будет выброшено исключение SyntaxError :

Ошибка возникает из-за того, что идентификатор class является одним из зарезервированных ключевых слов в Python. При его использовании Python автоматически начинает считать, что мы хотим определить класс объектов, но синтаксис для такой операции, очевидно, неверен.

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

Конечно, никто не обязан использовать именно слово “class” в качестве идентификатора для переменной, потому что это просто имя переменной; однако иногда именно такое название существенно улучшает читаемость кода, в таком случае не хочется — и не нужно, как мы узнали только что — избегать использования зарезервированных ключевых слов.

4. Изолированный атрибут объекта

Символ нижнего подчеркивания также используется для защиты некоторых атрибутов и методов в том случае, когда мы хотим оградить атрибут от использования вне объекта, которому он принадлежит.

Защита от импорта

Например, в файле с расширением .py пределены ряд констант и функций. После сохранения данного файла, любой программист может попробовать импортировать его в качестве модуля в другой файл программы; однако может статься так, что оный Python файл содержит исключительно локальные вспомогательные функции, которые не должны быть импортированы для использования в другой среде.

В таком случае проблему решает добавление знака нижнего подчеркивания перед константами или функциями: теперь они не будут импортироваться при выполнении команды from … import * .

Давайте создадим файл lib.py и внутри него определим следующие две функции:

Далее, в другом файле, выполним импорт всего содержимого из нашего модуля lib.py :

Теперь легко проверить, что первая test_func() была успешно импортирована, чего нельзя сказать о функции _test_func() !

Однако, пожалуйста, воспринимайте вышеописанный приём как “удобное средство”, предотвращающее импорт ненужных функций. Данный трюк НЕ помешает другому программисту явно импортировать куда угодно всё, что он захочет.

Явный импорт продолжает работать:

5. Защищенные атрибуты класса

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

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

Для примера мы определим класс под названием Person , а затем создадим его экземпляр:

Таким образом, для вывода на экран заранее заданной строки идеально подойдёт метод show() :

Тем не менее, если попытаться получить доступ к значению атрибута __name или вызвать метод __show(), которые “защищены” двойными подчеркиваниями в самом начале их идентификаторов, то произойдёт выброс исключения, и программа прекратит работу.

Опять же, эта “защита” не прописана на уровне интерпретатора, она удобна лишь тогда, когда хочется скрыть от вызова какой-то внутренний функционал класса, потому что всегда можно прибегнуть к явному вызову атрибута или метода: просто добавьте перед ними указание _<имя_класса> :

6. Специальные атрибуты и магические методы

Про магические методы знает каждый, но данный аспект настолько важен, что его нельзя пропускать так или иначе. Метод-конструктор __init__() , который использовался в одном из первых примеров статьи, как раз таки относится к магическим методам, в документации языка программирования Python называемым “специальные атрибуты”. Кроме метода-конструктора, одним из самых важных магических методов каждого класса можно назвать __repr__() , определяющий, что должно быть выведено при запросе строкового представления объекта. Если вы знакомы с Java, то легко узнаете в методе __repr__() примерный аналог toString() .

Для примера определим класс Person и переопределим его метод __repr__() , чтобы настроить вывод на экран при передаче функции print() экземпляра данного класса.

В первом примере метод __repr__() не переопределён, в следствии чего функция print() просто сообщает нам имя класса и его адрес в памяти компьютера, что не очень полезно для отладки:

Теперь давайте переопределим функцию __repr__() и попробуем снова:

Вывод

В статье представлены несколько приёмов, связанных с использованием символа нижнего подчеркивания в языке программирования Python. Некоторые из них позволяют получить дополнительные возможности в программировании, другие — улучшают читабельность и надежность кода программы. Кроме того, в статье рассмотрены способ защиты от импорта объектов, необходимых только для организации локальной работы одного модуля и способ защиты от перезаписи атрибутов/методов классов.

К вышеописанным советам стоит прислушаться хотя бы потому, что они ускорят ваш процесс понимания кода других Python-программистов.

Операторы в Python

Операторы — специальные символы, которые выполняют арифметические и логические вычисления. Значения, на которые действует оператор, называются операндами.

Здесь оператор + выполняет сложение, 2 и 3 — операнды, а 5 — вывод операции.

Арифметические операторы

Арифметические операторы используются для выполнения математических операций — сложения, вычитания, умножения и т. д.

Оператор

Действие

Пример

Сложение двух операндов или унарный плюс

Вычитание правого оператора из левого или унарный минус

Умножение двух операндов

Деление левого операнда на правый (результат всегда типа float)

Остаток от деления левого операнда на правый

x % y (остаток от x / y)

Деление с округлением — деление, результат которого корректируется в меньшую сторону

Показатель степени — левый операнд возводится в значение правого операнда

Вывод:

Операторы сравнения

Операторы сравнения используются для сравнения значений, они возвращают True или False в зависимости от условия.

Оператор

Действие

Пример

Больше чем: True, если левый операнд больше правого

Меньше чем: True, если левый операнд меньше правого

Равно: True, если операнды равны между собой

Не равно: True, если операнды не равны между собой

Больше или равно: True, если левый операнд больше или равен правому

Меньше или равно: True, если левый операнд меньше или равен правому

Вывод:

Логические операторы

Операторы and , or , not — логические.

Оператор

Действие

Пример

True, если значения обоих операндов True

True, если значение одного из операндов True

True, если значение операнда False (дополняет значение операнда)

Вывод:

Побитовые операторы

Побитовые операторы работают с операндами как со строками из 0 и 1. Они действуют бит за битом, как и говорит название.

Например, 2 в двоичной системе счисления — 10 , а 7 — 111 .

В таблице ниже: x = 10 ( 00001010 в двоичной системе счисления) и y = 4 ( 00000100 в двоичной системе счисления)

Оператор

Действие

Пример

x & y = 0 ( 00000000 )

x | y = 14 ( 00001110 )

x = -11 ( 11110101 )

x ^ y = 14 ( 00001110 )

Побитовый сдвиг вправо

x >> 2 = 2 ( 00000010 )

Побитовый сдвиг влево

x << 2 = 40 ( 00101000 )

Операторы присваивания

Операторы присваивания используются для назначения переменной некоторого значения.

a = 5 — простой оператор присваивания, который приравнивает значение 5 справа переменной а слева.

В Python множество составных операторов, подобных a += 5 — он прибавляет 5 к переменной a и позже присваивает ей получившееся значение. Этот оператор равносилен записи a = a + 5 .

Оператор

Пример

Эквивалентно

Особые операторы

В Python есть особые типы операторов: операторы тождественности и принадлежности.

Операторы тождественности

is и is not — операторы тождественности в Python. Они проверяют, находятся ли два значения (или две переменные) по одному адресу в памяти. То, что две переменные равны еще не значит, что они идентичны.

Оператор

Действие

Пример

True, если операнды идентичны (указывают на один объект)

True, если операнды не идентичны (не указывают на один объект)

Вывод:

Мы видим, что x1 и y1 — целочисленные переменные с одинаковыми значениями, поэтому они равны и идентичны. То же с x2 и y2 (строки).

Но x3 и y3 — списки. Они равны, но не идентичны, поскольку интерпретатор кладет их в разные места в памяти, хоть эти списки и равны.

Операторы принадлежности

in и not in — операторы принадлежности в Python. Они проверяют, есть ли значение или переменная в последовательности (строке, списке, кортеже, множестве или словаре). Иначе говоря, проверяют вхождение элемента в коллекцию. В словаре можно проверить только присутствие ключа, не значения.

Оператор

Действие

Пример

True, если значение или переменная есть в последовательности

True, если значения или переменной нет в последовательности

Вывод:

‘П’ есть в x , а вот строки ‘привет’ в x нет (помните: Python чувствителен к регистру). Таким же образом образом 1 — ключ, а ‘a’ — значение в словаре y , поэтому вывод ‘б’ in y — False .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *