§ 8.3. Типы данных. Литералы. Переменные

Школьный курс C++
Переход на аналогичную страницу курса C++
Содержание

Типы данных

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

Выше перечислены арифметические типы. В скобках указаны имена классов, которые управляют данными соответствующего типа. Каждый из этих классов содержит одноименную функцию преобразования к данному типу. Помимо арифметических типов, в ядро python входят типы данных, которые, по существу, являются массивами данных. В Python такие типы называют последовательностями. (С ними мы познакомимся в 9 классе). К последовательностям относятся: str (строка), list (список), set (множество), dict (словарь) и др. Большое количество абстрактных типов данных реализовано в стандартной библиотеке python.

Интеллект-карта: типы данных в Python

Литералы

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

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

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

  • String—литералы,
  • Byte—литералы и
  • F-строки (литерал строки с форматом)
'Это строка Юникода, в ней могут быть такие символы: ÄάξŞ'
b'This is the character string of the code table ASCII'
f'result: {value:{width}.{precision}}'

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

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

Для длинных строковых литералов используются тройные """ или ''' кавычки. В пределах тройных кавычек можно использовать двойные или одинарные кавычки, использовать перевод на новую строку.
К строковым литералам относятся так называемые Escape-последовательности (или управляющие последовательности). Они используются для описания определённых специальных символов внутри строковых литералов, то есть внутри ограничителей "" или ''. Вот некоторые из них:

  • \' — одинарная кавычка
  • \" — двойная кавычка
  • \n — новая строка
  • \t — горизонтальная табуляция
  • \v — вертикальная табуляция
Например:

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

Для форматированного вывода строки используется метка типа 's'. Поскольку этот формат используется по умолчанию, то её можно не указывать.

Str = 'Строка'
print('{:s}'.format(Str))
print('{:>10s}'.format(Str))
Строка
    Строка
Целочисленные литералы

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

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

12    7922816251426    0b100110111    0o377    0xdeadbeef

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

Таблица 1. Метки форматированного вывода для типа int
Метка Описание
b Бинарный формат. Выводит число в двоичной системе счисления
c Преобразует на выводе целое число в соответствующий символ юникода
d Десятичное целое число
n То же самое, что и ‘d’, за исключением того, что используется текущая настройка локали для вставки соответствующих символов разделителей.
o Число в восьмеричной системе счисления
x Шестнадцатеричное число
X То же самое, что и ‘x’, только буквенные символы выводятся прописными. Если указан параметр формата '#', то префикс 0X также выводится в верхнем регистре.
None Тоже самое, что и ‘d’.

Примеры:

D = 2021
print('{}{:5}'.format('Число', D))
print('{} => {:b}'.format('В двоичной системе', D))
print('{} => {:o}'.format('В восьмеричной системе', D))
print('{} => {:X}'.format('В шестнадцатеричной системе', D))

Вывод

Число 2021
В двоичной системе => 11111100101
В восьмеричной системе => 3745
В шестнадцатеричной системе => 7E5
Действительные литералы

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

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

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

Таблица 2. Метки форматированного вывода для типа float
Метка Описание
e Число в экспоненциальном (с плавающей точкой, научном) формате, ‘e’ — строчная
E Число в экспоненциальном формате, но разделитель ‘E’ — выводится прописной
f Число с фиксированной точкой
F Тоже, что и ‘f’, но ‘NAN’ и ‘INF’ (“не число” и “бесконечность”) выводятся прописными
g Общий числовой формат. Для заданной точности p >= 1 это число округляется до p значащих цифр, а затем форматирует результат как в формате с фиксированной точкой или в научной нотации в зависимости от величины.
G Тоже самое, что и ‘g’, но буквенные символы выводятся прописными
n Тоже самое, что и ‘g’, за исключением того, что используется текущая настройка локали для вставки соответствующих символов разделителей.
% Значение выводится в процентах (умножается на 100 и добавляется символ «%»)
None Аналогичен ‘g’, за исключением того, что нотация с фиксированной точкой, используется, тогда, когда число имеет по крайней мере одну цифру после десятичной точки. Точность по умолчанию настолько высока, насколько это необходимо для представления конкретного значения.

Примеры:

from math import pi
print('{} {}'.format('Число pi', pi))
print('{} => {:f}'.format('Метка f', pi * 10000))
print('{} => {:g}'.format('Метка g', pi * 10000))
print('{} => {:E}'.format('Метка E', pi * 10000))

Вывод

Число pi 3.141592653589793
Метка f => 31415.926536
Метка g => 31415.9
Метка E => 3.141593E+04

Для целых и действительных литералов можно применять разделитель разрядов '_' (нижнее подчеркивание):

10_000_000_000    0b_1110_0101    3.14_15_93

С остальными типами мы познакомимся позднее.

Переменные

На прошлом уроке мы выяснили, что данные в программу вводятся с помощью переменных. Переменная в 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'

Рисунок ниже демонстрирует то, как в этой программе переменные связываются с разными типами данных.

Первоначально переменная А была связана с целым типом, но затем принимает значение строкового типа. Операция умножения строки (многократное дублирование с конкатенацией) выполняется правильно, но операция сложения терпит крах, т. к. строковый тип такую операцию не поддерживает. Возможна лишь операция конкатенации (сцепление строк), но тогда необходимо преобразовать к строковому типу данные на которые ссылается вторая переменная – Б. После преобразования, операция конкатенации выполняется верно. Данные, на которые уже не ссылается ни один объект, уничтожаются “сборщиком мусора“.
Узнать какого типа данные, на которые ссылается данный объект, можно с помощью функции type(), а размер этих данных (в байтах) возвращает функция getsizeof() (из модуля sys)

from sys import getsizeof
a = 25
b = 25.0
c = '25'
print(a, b, c)
print(type(a), type(b), type(c))
print(getsizeof(a), getsizeof(b), getsizeof(c))

Вывод

25 25.0 25
<class 'int'> <class 'float'> <class 'str'>
28 24 51

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

  • Первый символ не должен быть числовым символом;
  • Первый символ может быть любой алфавитный символ ASCII, символ нижнего подчеркивания, а также любой символ национальных алфавитов (в кодировке UTF-8);
  • Далее в имени можно использовать как алфавитные, так и числовые символы, за исключением пробельных символов;
  • В качестве имени нельзя использовать служебные (ключевые) слова. Список этих слов можно получить с помощью импорта модуля keyword с вызовом контейнера ключевых слов keyword.kwlist:
    [python] >>> import keyword
    >>> keyword.kwlist
    [‘False’, ‘None’, ‘True’, ‘__peg_parser__’, ‘and’, ‘as’, ‘assert’, ‘async’, ‘await’, ‘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 позволяет переопределять имена встроенных объектов. Более простыми словами это означает, что в программу вводится имя, которое уже известно python. В результате существующая реализация объекта под этим именем станет недоступной. Это нежелательное явление. Например, вы осуществляете описание функции def min(). Но в python уже существует стандартная функция min(). В данном модуле, стандартная функция станет недоступной. Для того, чтобы избежать случайного переопределения имени, можно получить весь список имен встроенных объектов python с помощью функции dir().

Вывод функции dir()
[python] >>> 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’] [/python]
В python регистро-зависимые имена, т. е.: BookId, bookID, Bookid, bookid, bookId и т. д., — это разные имена.
При составлении имен желательно придерживаться какого-либо стиля, например, стиля CamelCase: имена пишутся слитно, каждое слово, описывающее назначение идентификатора, пишется с заглавной буквы. Этот стиль используется в двух вариантах: UpperCamelCase и lowerCamelCase. Первый используется для именования классов, второй для прочего: переменных, методов и т.п.

Приложение

Примеры решения задач
Вопросы
Темы сообщений
Задания А
Задания Б
Задания С
Ссылки
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Обсуждение закрыто.