Перейти к основному содержимому

Переменные и типы данных

Переменные связывают понятные имена с данными робота

Программа робота работает не только с командами, но и с данными: расстоянием до стены, напряжением аккумулятора, названием режима и признаком аварийной остановки. Чтобы не подставлять значения вручную в каждую строку, им дают имена. В Python такое имя связывается с объектом, а объект хранит значение и имеет определённый тип.

Коротко

Переменная в Python — это имя, связанное со значением. Оператор = создаёт или меняет эту связь. Тип принадлежит объекту: целые числа имеют тип int, дробные — float, текст — str, а логические значения True и Falsebool. Функции int(), float() и str() создают значения нужного типа из подходящих данных.

Зачем это нужно

Пусть робот получил расстояние 34 сантиметра. Само число не объясняет, что оно означает: расстояние, скорость двигателя, номер вывода или количество измерений. Имя distance_cm добавляет назначение и единицу:

distance_cm = 34
print(distance_cm)

Теперь значение можно вывести, сравнить с порогом и заменить новым измерением. При этом порог остановки, команда привода и состояние кнопки хранятся отдельно:

stop_distance_cm = 20
motor_command = 120
button_pressed = False

Правильный выбор типа влияет на доступные операции. Числа можно складывать, строку — соединять с другой строкой, а bool удобно использовать как результат проверки. Если текст "34" принять за число без преобразования, арифметика либо даст другой смысл, либо завершится исключением.

Главная идея

Полезная модель выглядит так:

имя переменной -> объект -> значение и тип

В выражении справа от = Python сначала вычисляет результат, затем связывает с ним имя слева:

sample_count = 3
sample_count = sample_count + 1
print(sample_count)

После второй строки имя sample_count связано со значением 4. Знак = здесь не означает математическое равенство навсегда. Это инструкция присваивания. Для сравнения на равенство позже используется ==.

У каждого объекта есть тип. Он определяет допустимые операции и поведение значения. Узнать тип в учебном эксперименте можно функцией type():

distance_cm = 34
battery_voltage_v = 7.4
robot_name = "Reversi rover"
emergency_stop = False

print(type(distance_cm))
print(type(battery_voltage_v))
print(type(robot_name))
print(type(emergency_stop))

Функция type() полезна для проверки гипотезы, но не должна заменять понятную модель данных. Лучше заранее решить, что обозначает переменная и какие операции ей нужны.

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

ТипПримерЧто хранить в роботеОсобенность
int42счётчик, номер режима, целое измерениецелые числа Python имеют произвольную точность
float7.4напряжение, коэффициент, дробное измерениемногие десятичные дроби представлены приближённо
str"forward"название режима, сообщение, строку из терминаластрока — неизменяемая последовательность символов
boolTrueнажатие кнопки, наличие препятствия, готовностьпринимает два логических значения: True и False
NoneNoneявное отсутствие результата или ещё не полученное измерениеэто отдельный объект, а не число 0 и не пустая строка

В одном проекте лучше последовательно выбирать единицы. Имена distance_cm, period_ms и voltage_v помогают заметить ошибку при ревью, хотя сам Python не проверяет физические единицы.

None — не «любая пустота»

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

Целые и дробные числа

С int и float доступны обычные арифметические операции:

left_ticks = 120
right_ticks = 116
average_ticks = (left_ticks + right_ticks) / 2
difference = left_ticks - right_ticks

print("Среднее:", average_ticks)
print("Разница:", difference)

Оператор / всегда возвращает дробный результат типа float. Целочисленное деление // округляет вниз, а % возвращает остаток:

samples = 17
full_groups = samples // 4
remaining_samples = samples % 4

print(full_groups)
print(remaining_samples)

Не заменяйте / на // только ради типа int. Сначала решите, должен ли алгоритм сохранять дробную часть. Среднее двух показаний 5 и 6 равно 5.5, а целочисленный результат потеряет половину единицы.

Дробные значения хранятся в конечном двоичном представлении. Поэтому результат может выглядеть неожиданно:

result = 0.1 + 0.2
print(result)

Это не случайная поломка Python. Числа 0.1 и 0.2 нельзя точно представить конечной двоичной дробью. Для управления роботом не следует проверять шумное измерение на точное совпадение с десятичным эталоном. Порог или допустимое отклонение выбирают по требованиям и характеристикам измерения.

Строки и понятный вывод

Строки записывают в одинарных или двойных кавычках:

robot_name = "Reversi rover"
motion_mode = "forward"
print(robot_name)
print(motion_mode)

Цифры в кавычках остаются текстом. "42" — строка, а 42 — целое число. Операция + для двух строк соединяет их, но для чисел складывает:

print("12" + "3")
print(12 + 3)

Чтобы собрать сообщение из текста и значений, удобно использовать форматированную строку, или f-строку:

distance_cm = 34
source = "model"
print(f"Источник: {source}; расстояние: {distance_cm} см")

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

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

Логические значения

bool удобно хранит ответ «да» или «нет». Логическое значение часто получается после сравнения:

distance_cm = 18.5
stop_distance_cm = 20.0
obstacle_detected = distance_cm < stop_distance_cm

print(obstacle_detected)

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

Записывайте True и False с заглавной буквы. Варианты true и false не являются этими встроенными константами Python.

Преобразование bool() проверяет истинность объекта. Пустая строка даёт False, непустая — True. Поэтому запись bool("False") неожиданно даёт True: слово внутри не разбирается как логическая команда, строка просто не пуста. Пользовательский текст "да" или "нет" нужно разбирать по явно заданным правилам.

Имена и повторное присваивание

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

front_distance_cm = 42
left_motor_command = 120
sensor_is_ready = True

Такой стиль соответствует рекомендации PEP 8 для функций и переменных. Константы по соглашению записывают заглавными буквами:

STOP_DISTANCE_CM = 20
MAX_MOTOR_COMMAND = 255

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

Одно имя можно связать с объектом другого типа:

sensor_value = 42
sensor_value = "нет данных"
print(sensor_value)

Язык это разрешает, но в инженерном коде такая смена смысла усложняет проверку. Чище использовать два имени, например distance_cm и sensor_status, или явно обозначить отсутствие измерения через None.

Преобразование типов

Преобразование строки в числовое измерение и логическое состояние

Функция input() возвращает строку, даже если человек ввёл только цифры:

raw_distance = input("Расстояние, см: ")
print(type(raw_distance))

Перед арифметикой данные нужно преобразовать:

raw_distance = "42"
distance_cm = int(raw_distance)
distance_m = distance_cm / 100

print(distance_cm)
print(distance_m)
ПреобразованиеПример результатаКогда применить
int("42")целое 42строка содержит запись целого числа
float("7.4")дробное 7.4строка содержит подходящую запись числа
str(42)строка "42"число нужно превратить в текст
bool("")Falseтребуется проверить пустоту строки, а не разобрать слово

int("7.4") не округляет строку и завершится ValueError: запись 7.4 не является целым литералом для такого преобразования. Сначала нужно решить, допустимы ли дробные данные, затем выбрать float() или отклонить ввод. Обработку исключений мы разберём позже; на этом этапе фиксируйте требуемый формат входа и проверяйте примеры отдельно.

Робототехническая модель данных

Соберём несколько типов в одном безопасном сценарии без управления настоящим мотором:

robot_name = "Reversi rover"
raw_distance_cm = "18.7"
distance_cm = float(raw_distance_cm)
stop_distance_cm = 20.0
obstacle_detected = distance_cm < stop_distance_cm
sample_count = 1
motor_command = 0

print(f"Робот: {robot_name}")
print(f"Измерение {sample_count}: {distance_cm} см")
print(f"Препятствие близко: {obstacle_detected}")
print(f"Модельная команда двигателя: {motor_command}")

Каждая переменная отвечает за один смысл:

ИмяТипНазначение
robot_namestrназвание стенда
raw_distance_cmstrисходная строка, как будто полученная извне
distance_cmfloatчисловое измерение
stop_distance_cmfloatпорог в той же единице
obstacle_detectedboolрезультат сравнения
sample_countintномер измерения
motor_commandintмодельная команда, ещё не отправляемая приводу

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

Что запомнить о данных

  • = вычисляет правую часть и связывает результат с именем слева;
  • тип принадлежит объекту и определяет его операции;
  • int подходит для целых значений, float — для дробных, str — для текста, bool — для логического состояния;
  • input() возвращает str;
  • преобразование типа должно соответствовать формату исходных данных;
  • единицу измерения и назначение полезно отражать в имени;
  • дробные вычисления могут быть приближёнными;
  • смена типа у одного имени разрешена, но обычно ухудшает модель программы.

Практика

  1. Создайте переменные для названия робота, номера испытания, напряжения аккумулятора и готовности датчика. Выведите значение и type() каждого объекта.
  2. Запишите расстояние в миллиметрах как int и вычислите сантиметры без потери дробной части. В именах укажите единицы.
  3. Получите строку расстояния через input(), преобразуйте её в float и выведите f-строкой. Проверьте отдельно корректный ввод и строку, которую нельзя преобразовать.
  4. Рассчитайте среднее двух целых показаний. Сравните / и // и объясните, какой оператор соответствует вашей задаче.
  5. Проверьте результаты bool(""), bool("False"), bool(0) и bool(1). Сформулируйте, почему bool() нельзя использовать как готовый разбор слов "да" и "нет".
  6. Смоделируйте расстояние, порог и логическое значение obstacle_detected. Не добавляйте готовое управление мотором: выбор действия относится к уроку об условиях.
  7. Придумайте два плохих имени без единицы или назначения и замените их на имена в стиле snake_case.

Проверьте себя

  1. Что делает оператор присваивания =?
  2. Чем "42" отличается от 42?
  3. Какой тип возвращает обычное деление /?
  4. Почему результат 0.1 + 0.2 может не совпасть с точной десятичной записью?
  5. Что возвращает input()?
  6. Почему bool("False") даёт True?
  7. Чем None отличается от нулевого измерения?
  8. Зачем записывать единицу в имени distance_cm?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

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

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

Словарь статьи

ТерминЗначение
переменнаяимя, связанное с объектом
объектзначение Python с определёнными типом и поведением
тип данныхнабор правил хранения и допустимых операций объекта
присваиваниевычисление правой части и связывание результата с именем
intтип целых чисел
floatтип дробных чисел с конечной двоичной точностью
strтип текстовых строк
boolлогический тип со значениями True и False
Noneобъект, обозначающий отсутствие значения
преобразование типасоздание значения нужного типа из подходящего исходного объекта
f-строкастрока, в которую подставляются результаты выражений в фигурных скобках
snake_caseстиль имени из строчных слов, разделённых подчёркиваниями

Связанные темы

  • Первая программа — запуск скрипта и диагностический вывод.
  • Условия — выбор действия по логическому значению.
  • Циклы — повторное обновление измерений и счётчиков.
  • Работа с файлами — чтение строк и сохранение результатов измерений.

Источники