Четыре типа,
четыре ловушки

Типы данных. Целые и вещественные числа. Случайные числа.
10 класс, углублённый уровень — занятие третье.

В прошлый раз мы смотрели, как программа выполняется. Сегодня — из чего сделаны значения, которыми она оперирует, и где каждый тип подводит того, кто об этом не думает.

Переменная — это ярлык

C++, Java, C#

int x = 5;
x = "пять";   // ошибка до запуска

Тип объявляется у переменной и закреплён за ней навсегда. Это статическая типизация.

Python

x = 5
x = "пять"    # можно
print(type(x))   <class 'str'>

Тип принадлежит значению, переменная — имя, привязанное к нему. Это динамическая типизация.

Четыре типа

ТипЧто хранитКак получить
intцелые int("7"), a // b, round(x)
floatвещественные float("3.5"), a / b
strстроки input(), str(5), кавычки
boolTrue / False любое сравнение, bool(x)

Ловушка 1: целые и деление

print(17 // 5, 17 % 5)      3 2
print(-17 // 5, -17 % 5)    -4 3   # не -3 и не -2!

Что на этом строится

Цифры числа

n % 10     # последняя
n // 10    # отрезать её

Делимость

if n % d == 0:
    print(d, "делитель")

Ловушка 2: вещественные

print(0.1 + 0.2)          0.30000000000000004
print(0.1 + 0.2 == 0.3)   False

Следствие: не сравнивать на равенство

total = 0.7 + 0.1          # курьер проехал 0.7 и 0.1 км
plan = 0.8
print(total >= plan)       False   # 0.7999999999999999

Округлить, отбросить, показать

print(round(2.5), round(3.5))   2 4
print(int(3.9), int(-3.9))      3 -3
print(f"{2.5:.2f}")             2.50

«/» всегда даёт float

print(6 / 3)        2.0
print(6 // 3)       2
print(7 // 2.0)     3.0   # делитель вещественный — и результат тоже
print(1.5 + 2)      3.5   # int + float = float

Ловушка 3: строка, похожая на число

a = input()          # ввели 5
print(a + a)         55
print(a * 3)         555
print(a + 1)         TypeError
print("9" > "10")    True   # строки сравниваются как слова в словаре

Ловушка 4: логический тип

print(3 == 3.0, "3" == 3)    True False
print(True + True)           2
print(bool(0), bool("0"))    False True
print(1 < 7 < 10)            True

Случайные числа

Которые на самом деле не случайные.

Модуль random

from random import *     # функции зовём по имени, без random.
randint(1, 6)            # целое от 1 до 6, ОБА конца входят
randrange(1, 6)          # от 1 до 5 — как range
random()                 # вещественное от 0 включительно до 1 не включая
randrange(0, 100, 5)     # от 0 до 95 с шагом 5
seed(7)                  # закрепить начало: дальше числа одни и те же

Псевдослучайные

Случайности внутри компьютера нет. Есть формула.

x = (x * 1664525 + 1013904223) % 2**32     # следующее из предыдущего

Где это нужно

  • Игры — кубик, карты, случайный враг.
  • Розыгрыши — а seed делает розыгрыш проверяемым: любой может повторить и убедиться, что не подтасовано.
  • Тесты программ — оболочка сегодня гоняет ваши программы на случайных наборах данных. Именно так.
  • Моделирование — бросить точки наугад и посчитать, сколько попало в круг: получится число π. Метод Монте-Карло.

Что делаем сегодня

Тренажёр

Двенадцать коротких программ: какого типа результат, что напечатает — с целыми, вещественными, строками, логическими и случайными.

Считаем в уме и на бумаге. Ответ — ровно то, что на экране: 2.0 и 2 — разные ответы.

Три программы

  1. Делители — все делители числа (задание 25 ЕГЭ)
  2. Зарплата курьера — вещественные, формат, план
  3. Кубик — серия бросков с seed, сумма и шестёрки

Сохраняем в свою папку как zadanie1.py … zadanie3.py.

Как работаем

ЧтоГдеСколько
Тренажёрпрактикум, наверху страницы15 минут
Три программыIDLE30 минут
ПроверкаПроверка.batпопыток сколько угодно

За работу

Открывайте практикум. Начинаем с тренажёра.

Застряли на программе — не угадывайте. Посмотрите на тип каждого значения: целое, вещественное, строка. Половина ошибок сегодня будет именно в этом.

Материалы подготовлены с использованием технологий искусственного интеллекта. Пробел раскрыть и дальше · ← → слайды