§3. Алфавит Python. Типы данных. Переменные

Лексемы

Лексический анализ

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

  • Ключевые слова (keywords)
  • Идентификаторы (identifiers)
  • Литералы (literals)
  • Операции (operators)
  • Знаки пунктуации (разделители, punctuators)

Идентификаторы

Идентификатор — это имя программного объекта: переменной, константы, массива, функции, класса и т. п.
При выборе имени для объекта необходимо руководствоваться следующими правилами:
первый символ не должен быть числовым символом;

  1. первый символ может быть любой алфавитный символ ASCII, символ нижнего подчеркивания, а также любой символ национальных алфавитов (в кодировке UTF-8);
  2. далее в имени можно использовать как алфавитные, так и числовые символы, за исключением пробельных символов;
  3. в качестве имени нельзя использовать служебные (ключевые) слова; список этих слов можно получить в интерактивном режиме с помощью импорта модуля keyword с вызовом контейнера ключевых слов keyword.kwlist:
    >>> import keyword
    >>> keyword.kwlist
    ['False', 'None', 'True', 'and', 'as', 'assert', 'break',
    'class', 'continue', 'def', 'del', 'elif', 'else', 'except',
    'finally', 'for', 'from', 'global', 'if', 'import', 'in',
    'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise',
    'return', 'try', 'while', 'with', 'yield']
    

    Примечание: Python позволяет переопределять имена встроенных объектов, поэтому необходимо знать допустимость использования того или иного идентификатора. Для того, чтобы узнать весь список имен встроенных объектов python, можно использовать функцию dir() с параметром __builtins__:

    >>> dir(__builtins__)
    ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
    'lockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 
    'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 
    'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 
    'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 
    'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 
    'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 
    'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 
    'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 
    'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 
    'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 
    'ProcessLookupError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 
    'RuntimeWarning', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 
    'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 
    'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 
    'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 
    'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__', 
    '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', 
    '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 
    'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 
    'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 
    'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 
    'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 
    'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 
    'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 
    'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 
    'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 
    'tuple', 'type', 'vars', 'zip']
    
  4. нельзя использовать два подряд символа нижнего подчеркивания в начале и в конце идентификатора;
  5. в python регистро-зависимые имена, т. е.: BookId, bookID, Bookid, bookid, bookId и т. д., — разные имена.

Литералы

Литералы, иначе константы — это неизменяемые величины.

Строковые литералы

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

  1. String — литералы и
  2. Byte — литералы

String-литералы могут содержать любой символ UTF-8. Byte-литералы только символы ASCII. Byte-литералам должен начинаться с префикса “B” или “b”. Литералы обоих типов должны заключаться в двойные (“”) или одинарные кавычки (”).
Для длинных строковых литералов используются тройные кавычки """ или '''. В пределах тройных кавычек можно использовать двойные или одинарные кавычки, использовать перевод на новую строку.
Строка в Python не изменяемый объект. Однако, данная строка может быть заменена на другую строку. Содержимое же исходной строки будет утрачено. Подробно работу со строкой мы осветим позже.

"Это строка Юникода, в ней могут быть такие символы: ÄάξŞ"
b"This is the character string of the code table ASCII"

Примечание. Строка Byte-литерала содержит только первую часть таблицы ASCII, содержащую 128 символов, в ней отсутствуют, к примеру, кириллические символы расширенной версии ASCII.

Escape-последовательности

Escape-последовательности (или управляющие последовательности) используются для описания определённых специальных символов внутри строковых литералов, то есть внутри ограничителей “” или ”. Вот некоторые из них:
\' — одинарная кавычка
\" — двойная кавычка
\? — вопросительный знак
\\ — обратный слеш
\n — новая строка
\t — горизонтальная табуляция
\v — вертикальная табуляция
\0 — нулевой символ
Например:

print("Ветер на море гуляет\nИ кораблик подгоняет;\nОн бежит себе в волнах\nНа раздутых парусах.")
Ветер на море гуляет
И кораблик подгоняет;
Он бежит себе в волнах
На раздутых парусах.
Целочисленные литералы

В python поддерживаются целочисленные литералы четырех типов:

  1. decimalinteger — десятичные числа. Префикс не используется.
  2. octinteger — восьмеричные числа. Префикс "0O" или "0o".
  3. hexinteger — 16-ричные числа. Префикс "0x" или "0X".
  4. bininteger — двоичные числа. Префикс "0b" или "0B".

Примеры целочисленных литералов

7     2147483647                        0o177    0b100110111
3     79228162514264337593543950336     0o377    0xdeadbeef
Действительные литералы

Действительные или вещественные числа представлены литералами двух типов:

  1. с фиксированной точкой: 5.7, .001, 35., 0.0
  2. с плавающей точкой (экспоненциальный): 0.2E6, .11e-3, 5E10, 2.e-10

Примечание. Для представления порядка и мантиссы используются десятичные числа. Числовые литералы не включают в себя знак (“-” или “+”).
Примечание. К числовым литералам относятся также мнимые литералы.

Операции. Разделители. Неиспользуемые символы

Операции

Список литералов, используемых для операций в языке Python:

+       -       *       **      /       //      %      @
<<      >>      &       |       ^       ~
<       >       <=      >=      ==      !=
Разделители

Эти литералы используются в качестве разделителей:

(       )       [       ]       {       }
,       :       .       ;       @       =       ->
+=      -=      *=      /=      //=     %=      @=
&=      |=      ^=      >>=     <<=     **=
Неиспользуемые символы

Эти символы ASCII не используются в языке Python:

$  ?  `

Их появление за пределами строковых литералов и комментариев является безусловной ошибкой.

Типы данных. Переменные

Python является языком с динамической типизацией данных, это означает, что тип переменной определяется только во время исполнения. Поэтому вместо «присваивания значения переменной» принято говорить о «связывании значения с некоторым именем». В python существуют следующие типы:

  • строковый (str),
  • логический (булевский),
  • целое число произвольной точности (int),
  • число с плавающей точкой (float),
  • комплексное число (complex),
  • рациональное число (fractions)
  • десятичное число с фиксированной точкой (decimal)
и некоторые другие (первые пять типов являются стандартными типами в python).
Такое разнообразие типов используется потому, что данные различных типов в памяти представляются различным образом. Каждому типу данных определяется свой набор допустимых операций и функций. Основные типы даных мы рассмотрим последовательно, в процессе прохождения курса (за исключением complex).
Чтобы использовать данные различных типов и производить над ними различные операции необходимо использовать переменные. Python, как мы уже сказали, определяет тип переменной во время выполнения программы. Переменная имеет имя (идентификатор), которое подчиняется правилам для идентификаторов (см. выше). Значение некоторого типа, хранящееся в памяти, связывается с эти именем. Это имя можно затем связать с другими данными того же или иного типа. Если в программе данные не связаны с каким-либо именем - они утрачиваются (т.е удаляются из памяти). Для связывания значения с именем переменной используется операция "=". Приведем пример программы демонстрирующей работу с данными разных типов для этого будем использовать интерактивный режим:

>>> А = 4
>>> Б = 5
>>> А * Б
20
>>> А = "Четыре";
>>> А * Б
'ЧетыреЧетыреЧетыреЧетыреЧетыре'
>>> А + Б
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    А + Б
TypeError: Can't convert 'int' object to str implicitly
>>> А + str(Б)
'Четыре5'

В первых двух строках мы связали объекты целочисленного типа с именами А и Б.
Примечание: кириллические символы здесь используются для иллюстрации возможности использования в python, в качестве идентификатора - не латинского символа Unicode
В стр. 5 с А связан теперь объект строкового типа и операция в стр. 6 вернет нам уже не число (20), а новую строку. Здесь операция "*" применяется к строке: строка увеличивается в 5 раз, путем добавления одного и того же набора символов. Однако, операция "+" не разрешена для строкового и целого типа. В сообщении об ошибке указывается, что тип int (целое число) не приведен к типу str (строка). В стр. 13 эта ошибка исправлена с помощью функции str(), которая преобразует число в строку. В результате операция проходит без ошибок, т. к. операция "+" применима к строкам (конкатенация, т. е. присоединение строки).
Рисунок ниже демонстрирует как в программе переменные связываются с разными типами.

Узнать какого типа данный объект можно с помощью функции type():

a = 25
b = 3.14
c = 'Вася'
print(type(a), type(b), type(c))
<class 'int'> <class 'float'> <class 'str'>
Вопросы
  1. Перечислите правила использования идентификаторов
  2. Что произойдет, если вывести строковый литерал в котором встретился символ '\n'? '\t'?
  3. Для чего нужны комментарии?
  4. Какие из этих идентификаторов не содержат ошибок:
    A, A1, a1, _1a, 1A, a_1, A1, A 1, _A1, aA, Aa, A_a, a_A, 10A, 10a, 10_A, a10_, 10 a, a__10, A10a, a10A, a_10A, A_10A?
Print Friendly, PDF & Email

Comments are closed