§3 Алфавит Python. Литералы. Идентификаторы. Ключевые слова

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

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

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

Строки исходного файла

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

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

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

    begin_fill()
    for i in range(5):
        fd(150)
        for j in range(5):
            fd(50)
            left(144)
        left(144)
    end_fill()
    
  • Комментарии
  • Комментарии в Python начинаются с символа "#". Комментарий заканчивается в конце физической строки и означают конец логической строки, если не используется неявное соединение строки (см. ниже). Комментарии игнорируются компилятором. “Текст программы говорит о том, как, а комментарии должны объяснять, почему” («A Byte of Python» Swaroop Chitlur).

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

    if 1900 < year < 2100 and 1 <= month <= 12 \
       and 1 <= day <= 31 and 0 <= hour < 24 \
       and 0 <= minute < 60 and 0 <= second < 60:   # Успешная проверка даты
            return 1
    
  • Не явное объединение физических строк
  • Выражения в скобках, в квадратных скобках, либо в фигурных скобках можно разделить на несколько физических строк без использования обратной косой черты. Например:

    month_names = ['Januari', 'Februari', 'Maart',      # Здесь перечислены
                   'April',   'Mei',      'Juni',       # датские названия
                   'Juli',    'Augustus', 'September',  # месяцев
                   'Oktober', 'November', 'December']   # года
    

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

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

  1. первый символ не должен быть числовым символом;
  2. первый символ может быть любой алфавитный символ ASCII, символ нижнего подчеркивания, а также любой символ национальных алфавитов (в кодировке UTF-8);
  3. далее в имени можно использовать как алфавитные, так и числовые символы, за исключением пробельных символов;
  4. в качестве имени нельзя использовать служебные (ключевые) слова; список этих слов можно получить в интерактивном режиме с помощью импорта модуля 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', 'BlockingIOError', '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']
    
  5. нельзя использовать два подряд символа нижнего подчеркивания в начале и в конце идентификатора;
  6. в python регистро-зависимые имена, т. е.: BookId, bookID, Bookid, bookid, bookId и т. д., – разные имена.

Литералы

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

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

    "Это строка Юникода, в ней могут быть такие символы: ÄάξŞ"
    b"Это строка символов кодовой таблицы ASCII"
    
  • Целочисленные литералы
  • В 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
    Примечание. Для представления порядка и мантиссы используются числа по основанию 10. Числовые литералы не включают в себя знак ("-" или "+").
    Примечание. К числовым литералам относятся также мнимые литералы.

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

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

Ветер на море гуляет
И кораблик подгоняет;
Он бежит себе в волнах
На раздутых парусах.

Операции

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

+       -       *       **      /       //      %      @
<<      >>      &       |       ^       ~
<       >       <=      >=      ==      !=

Разделители

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

(       )       [       ]       {       }
,       :       .       ;       @       =       ->
+=      -=      *=      /=      //=     %=      @=
&=      |=      ^=      >>=     <<=     **=

Разделители сокращенного присваивания могут выступать и как разделители и как операции.

Неиспользуемые символы

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

$  ?  `

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

Вопросы

  1. Перечислите правила использования идентификаторов
  2. Что произойдет, если вывести строковый литерал в котором встретился символ '\n'? '\t'?
  3. Для чего нужны комментарии?
  4. Какие из этих идентификаторов не содержат ошибок:
  5. 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?

Темы сообщений

  • Венгерская нотация
  • Строковые литералы
  • Cистемы генерации документации
  • Системы контроля версий
  • Unicode
  • Кодировка utf-8

Презентация

ODP

Учебник

§55, вопр. 1, 2, 3.

Print Friendly, PDF & Email

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