Объекты, ссылки и проверка типов
Базовые понятия о переменных и типах
Переменная в Python это имя, связанное с объектом. Объект хранит свой тип, а имя не имеет фиксированного типа. Поэтому одной и той же переменной можно присваивать число, строку или другой объект.
Основные встроенные типы данных: целые числа int, дробные числа float, комплексные числа complex, строки str, логические значения bool, специальное значение None, списки list, кортежи tuple, диапазоны range, словари dict, множества set и frozenset, байтовые типы bytes и bytearray.
Как создать переменную и определить её тип?
Создание переменной выполняется знаком равенства. Функция type() возвращает тип объекта, на который указывает имя.
user_name = 'Анна'
print(user_name, type(user_name))
user_age = 28
print(user_age, type(user_age))
height = 1.67
print(height, type(height))
is_student = True
print(is_student, type(is_student))3 python типы данных переменные (типы данных и переменные в python)
Анна <class 'str'> 28 <class 'int'> 1.67 <class 'float'> True <class 'bool'>
Пояснение шагов:
- Переменной
user_nameприсвоена строка'Анна'. Тип объектаstr. - Переменной
user_ageприсвоено целое число. Тип объектаint. - Переменной
heightприсвоено дробное число. Тип объектаfloat. - Переменной
is_studentприсвоено логическое значение. Тип объектаbool.
Частая ошибка: обращение к переменной до её создания.
print(unknown_value)
NameError: name 'unknown_value' is not defined
Перед использованием переменной нужно присвоить ей значение. Другая ошибка: имя совпадает с ключевым словом языка.
class = 1
SyntaxError: invalid syntax
Для имён переменных допустимы буквы, цифры и символ подчёркивания. Имя не может начинаться с цифры и не должно совпадать с зарезервированными словами Python.
Как одной строкой присвоить значения нескольким переменным?
Множественное присваивание сокращает код и полезно, когда значение заранее разбито на части.
first_name, last_name, age = 'Иван', 'Петров', 30
print(first_name)
print(last_name)
print(age)
a = b = c = 0
print(a, b, c)
Иван Петров 30 0 0 0
В первом случае значения из правой части распаковываются по именам слева. Во втором случае все три имени ссылаются на одно значение 0.
Как поменять значения двух переменных?
Обмен значений выполняется без временной переменной. Запись x, y = y, x создаёт кортеж из правой части и распаковывает его в имена слева.
x = 10
y = 20
x, y = y, x
print(x, y)
20 10
Такой способ применяется в алгоритмах сортировки и в циклах с перестановками элементов.
Как проверить принадлежность значения к конкретному типу?
Функция isinstance() проверяет тип объекта и возвращает True или False.
value = 100
print(isinstance(value, int))
print(isinstance(value, float))
print(isinstance(value, (int, float)))
True False True
Проверка типов нужна при обработке пользовательского ввода и при работе с данными, которые могут иметь несколько форматов.
Как изменить тип значения при необходимости?
Для явного преобразования применяются функции int(), float(), str(), list(), tuple(), set().
number_str = '42'
number = int(number_str)
print(number + 8)
pi_str = '3.14'
pi = float(pi_str)
print(pi)
digits = [1, 2, 3]
digits_tuple = tuple(digits)
print(digits_tuple)
50 3.14 (1, 2, 3)
Преобразование используется при чтении данных из файлов, из форм на сайтах и при подготовке чисел к математическим операциям.
Как подсказать ожидаемый тип в коде?
Аннотации типов в Python 3 служат для документации и статического анализа. Они не меняют поведение программы.
def make_greeting(name: str) -> str:
return 'Привет, ' + name
counter: int = 0
items: list[str] = ['a', 'b']
Аннотации полезны в крупных проектах, где важно показать тип параметров функции и возвращаемого значения. Для работы с новыми синтаксическими формами, такими как list[str], нужен Python 3.9 или новее.
Как обозначить отсутствие значения?
Специальное значение None используется для отсутствия результата. Логические значения True и False применяются в условиях.
result = None
print(result is None)
is_ready = False
if not is_ready:
print('Не готово')
True Не готово
Такая форма часто встречается в функциях, которые возвращают результат не для всех входных данных.
Как выбрать коллекцию для хранения нескольких значений?
Список list изменяемый и упорядоченный. Кортеж tuple неизменяемый. Множество set хранит уникальные элементы. Словарь dict связывает ключи со значениями.
colors = ['red', 'green', 'blue']
point = (10, 20)
unique_ids = {1, 2, 3}
person = {'name': 'Ольга', 'age': 31}
Выбор коллекции зависит от задачи. Список подходит для изменяемой последовательности, кортеж для неизменяемой, множество для проверки принадлежности и удаления дублей, словарь для отображения ключей на значения.
Отдельная ошибка: попытка изменить кортеж после создания. Кортеж относится к неизменяемым типам.
point = (1, 2)
point[0] = 5
TypeError: 'tuple' object does not support item assignment
Для изменяемой последовательности следует использовать список list.
Как работают ссылки при копировании списка?
Присваивание списка новой переменной не создаёт копию. Обе переменные ссылаются на один объект.
a = [1, 2, 3]
b = a
b.append(4)
print(a)
print(b)
print(a is b)
[1, 2, 3, 4] [1, 2, 3, 4] True
Для неизменяемых объектов такая особенность почти не влияет на поведение, так как значение заменяется целиком.
x = 10
y = x
x = 15
print(x)
print(y)
15 10
Как распаковать последовательность с центральной частью?
Звёздочка перед именем собирает оставшиеся элементы в список.
numbers = [1, 2, 3, 4, 5]
first, *middle, last = numbers
print(first)
print(middle)
print(last)
1 [2, 3, 4] 5
Это удобно при разборе кортежей, строк и данных из баз.
Как получить точное десятичное значение?
Обычные дроби float могут давать приближённый результат. Для денежных расчётов применяется Decimal.
from decimal import Decimal
price1 = Decimal('0.1')
price2 = Decimal('0.2')
print(price1 + price2)
regular_price = 0.1 + 0.2
print(regular_price)
0.3 0.30000000000000004
Класс Decimal принимает строку или целое число и сохраняет десятичную точность.
Как работать с байтовыми данными?
Тип bytes хранит неизменяемую последовательность байтов. Тип bytearray позволяет изменять отдельные байты.
data = b'hello'
print(type(data))
print(data.upper())
mutable_data = bytearray(data)
mutable_data[0] = 72
print(mutable_data)
<class 'bytes'> b'HELLO' bytearray(b'Hello')
Как передать переменное число аргументов?
Параметр с одной звёздочкой собирает все позиционные аргументы в кортеж.
def print_all(*args):
for item in args:
print(item)
print_all(1, 'два', 3.0)
1 два 3.0
Подобный способ применяется в функциях-обёртках и в логировании.
Как преобразовать строку с числами в список?
Метод split() делит строку по пробелам, а функция map() применяет int() к каждому элементу.
values = '10 20 30'
numbers = list(map(int, values.split()))
print(numbers)
print(sum(numbers))
[10, 20, 30] 60
Как объединить два словаря?
Оператор | в Python 3.9 создаёт новый словарь, объединяя пары ключ-значение.
base = {'name': 'Аня', 'age': 23}
extra = {'city': 'Сочи'}
profile = base | extra
print(profile)
{'name': 'Аня', 'age': 23, 'city': 'Сочи'}
Если ключ присутствует в обоих словарях, значение берётся из правого словаря.
Как использовать frozenset в качестве ключа словаря?
Обычное множество нельзя использовать как ключ словаря, так как оно изменяемое. Замороженное множество frozenset неизменяемое и хешируемое.
tags = frozenset({'python', 'типы'})
sections = {tags: 'Основы'}
print(sections[tags])
Основы
Такой приём удобен для группировки данных по неизменяемым наборам меток.
Как использовать выражение присваивания в условии?
Оператор := присваивает значение и сразу передаёт его в выражение.
text = 'привет'
if (length := len(text)) > 3:
print(length)
6
Такой приём сокращает повторное вычисление длины и делает код компактнее.