Научись выполнять задание 10 своим кодом
Пройди шаги: пойми действие, напиши строки, запусти Python и проверь значения. Затем реши задачу с пустого редактора.
Построй сеть NETWORK. Найди её наибольший адрес компьютера и выведи сумму его октетов.
1. Построить сеть по IP узла
Импортируй ip_network и создай ip_net с strict=False.
У исходного IP узловые биты не нулевые. Strict=False находит сеть, содержащую узел.
Строки этого шага и порядок действий
from ipaddress import ip_network
ip_net = ip_network(NETWORK, strict=False)Эти переменные уже доступны в редакторе. Используй их в решении.
Учебный CSV в рабочей папке
Tab — 4 пробела для отступа · Ctrl+Enter — проверка · код сохраняется в этом браузере
Python работает в браузере. Первый запуск загружает среду и требует интернета; затем можно запускать и исправлять код здесь.
Вывод программы
Здесь появится вывод print.
Значения после выполнения
Запусти код, чтобы увидеть значения.
Пройди по выполненным строкам
Для обычного шага показаны значения перед выделенной строкой. Для возврата из функции — значения при завершении вызова.
После своей попытки: посмотреть решение для сверки
Видео по заданию №10
Видео скоро выйдет.
Шпаргалка, дополнительные разборы и упражнения
Задание 10 ЕГЭ: сначала пойми, что требуется от IP-адресов
В одном типе нужно выбрать конкретный адрес из сети. В другом — перебрать адреса и посчитать подходящие по двоичному условию. Для обоих используем стандартный модуль ipaddress; устанавливать его отдельно не нужно.
| Что спрашивают | Основное действие | Какой ответ |
|---|---|---|
| Наибольший адрес компьютера | Построить сеть, взять ip_net[-2] | IP или сумма его октетов — прочитай последнюю фразу. |
| Адрес сети / broadcast | Взять ip_net[0] / ip_net[-1] | Нужный адрес диапазона. |
| Сколько адресов удовлетворяют условию | Цикл по нужному диапазону и count += 1 | Количество, а не один IP. |
Индексы компьютеров здесь разбираем для обычных IPv4-подсетей, как в шпаргалке: крайние адреса заняты сетью и broadcast. Особенности /31 и /32 не нужны для этих примеров; о них есть пояснение в конце.
ip_network: что передать и зачем strict=False
from ipaddress import ip_network
ip_net = ip_network('68.203.243.87/255.255.224.0', strict=False)В кавычках одна строка: IP, косая черта, маска. Мы передали IP узла, у которого узловые биты могут быть ненулевыми. strict=False позволяет построить содержащую его сеть. Это та же настройка, что второй аргумент 0 в шпаргалке: ip_network('...', 0).
Не путай две косые черты: внутри строки IP/маска разделяет адрес и маску. Никакого деления Python эта часть строки не выполняет. Маску можно также записать длиной префикса: /19 соответствует 255.255.224.0, /21 — 255.255.248.0.
| Нужный адрес | Индекс | Для примера из шпаргалки |
|---|---|---|
| Адрес сети | ip_net[0] | 68.203.224.0 |
| Первый компьютер | ip_net[1] | 68.203.224.1 |
| Последний компьютер | ip_net[-2] | 68.203.255.254 |
| Broadcast | ip_net[-1] | 68.203.255.255 |
Почему сеть начинается с 224 в третьем октете?
Маска третьего октета 224 = 11100000₂. Третий октет IP 243 = 11110011₂. Побитовое И оставляет 11100000₂ = 224. Последний октет маски равен 0, поэтому последний октет адреса сети — 0.
В маске 19 единиц и 13 нулей: внутри сети 2¹³ = 8192 адреса. Третий октет в диапазоне 224–255, последний 0–255. Это объясняет границы, которые Python уже нашёл за нас.
Наибольший адрес компьютера и сумма октетов
1. Выбираем правильный край диапазона
ip_net[-2] даёт 68.203.255.254. Адрес 68.203.255.255 — broadcast: он на единицу больше, но условию про компьютер не соответствует.
2. Превращаем четыре октета в числа и складываем
| Строка | Результат |
|---|---|
ip = ip_net[-2] | Объект адреса 68.203.255.254 |
str(ip) | Текст '68.203.255.254' |
str(ip).split('.') | Части ['68', '203', '255', '254'] |
sum(map(int, octets)) | 68 + 203 + 255 + 254 = 780 |
3. Полная программа сразу выводит требуемый ответ
from ipaddress import ip_network
ip_net = ip_network('68.203.243.87/255.255.224.0', strict=False)
ip = ip_net[-2]
octets = str(ip).split('.')
print(sum(map(int, octets)))В шпаргалке напечатан сам адрес, а сумма посчитана после него. Здесь добавлены последние строки, чтобы программа сразу вывела 780. Для проверки адреса временно напиши print(ip), затем убери этот диагностический вывод.
Сколько IP имеют число единиц, не кратное 5?
1. Выбираем диапазон по условию
Требуются IP-адреса сети, поэтому используем for ip in ip_net:. Сюда входят и адрес сети, и broadcast. Если бы требовались только адреса компьютеров этой подсети, использовали бы ip_net.hosts().
2. Считаем единицы по четырём октетам
| Октет | bin(...)[2:] | Число единиц |
|---|---|---|
| 172 | 10101100 | 4 |
| 16 | 10000 | 1 |
| 168 | 10101000 | 3 |
| 0 | 0 | 0 |
Для 172.16.168.0 всего 4 + 1 + 3 + 0 = 8 единиц. Цепочка bin(int(mas[1]))[2:] сначала превращает строку '16' в число 16, затем в двоичную строку и убирает префикс 0b.
В выводе bin нет ведущих нулей. Для подсчёта единиц они не нужны. Но для количества нулей или проверки позиций необходимо дополнять каждый октет до 8 бит: format(int(octet), '08b').
3. Переводим «не кратно 5»
| Фраза | Условие |
|---|---|
| Количество единиц кратно 5 | ones % 5 == 0 |
| Не кратно 5 | ones % 5 != 0 |
| Чётное количество | ones % 2 == 0 |
| Ровно 10 единиц | ones == 10 |
Для 8 единиц остаток от деления на 5 равен 3, значит адрес проходит. Ровно 10 единиц дали бы остаток 0 и не прошли бы.
4. Собираем код по шпаргалке
from ipaddress import ip_network
ip_net = ip_network('172.16.168.0/255.255.248.0', strict=False)
count = 0
for ip in ip_net:
mas = str(ip).split('.')
mas2 = [bin(int(mas[0]))[2:], bin(int(mas[1]))[2:],
bin(int(mas[2]))[2:], bin(int(mas[3]))[2:]]
ones = (mas2[0].count('1') + mas2[1].count('1')
+ mas2[2].count('1') + mas2[3].count('1'))
if ones % 5 != 0:
count += 1
print(count)mas хранит четыре текстовых октета, mas2 — четыре двоичных строки. ones складывает числа единиц. Count растёт только после проверки. Итоговый print(count) находится после цикла; break здесь не нужен.
Как сократить программу после понимания четырёх октетов
int(ip) даёт числовое значение всего IPv4-адреса. Подсчитать единицы можно сразу в его двоичной записи. Результат тот же:
from ipaddress import ip_network
ip_net = ip_network('172.16.168.0/255.255.248.0', strict=False)
count = 0
for ip in ip_net:
ones = bin(int(ip))[2:].count('1')
if ones % 5 != 0:
count += 1
print(count)Для нулей по-прежнему нужна полная ширина 32 бита: format(int(ip), '032b'). Укорачивать код имеет смысл после того, как понятно, какие адреса и какие биты требуется проверить.
Проверь границы сети и подсчёт единиц
Измени IP и маску-префикс. Укажи, нужен весь диапазон или только компьютеры, и делитель для условия «не кратно». Тренажёр покажет все четыре границы и фрагмент перебора. Для удобства здесь доступны подсети /19–/30.
| IP из перебора | Двоичные октеты | Единиц | Проходит? |
|---|
Таблица показывает первые восемь и последние два адреса выбранного диапазона. Количество рассчитывается по всему выбранному диапазону. Введённый Python на странице не исполняется.
Собери три программы и проверь их вывод
В новых задачах изменены данные. Заполни пропуски выражениями из разобранных шаблонов, скопируй собранный код в свой редактор Python, запусти и введи итоговый ответ. Для следующего шага в учебном архиве есть условия с пустым местом для твоего решения.
Кнопка «Проверить строки» сравнивает фрагменты с шаблоном. Страница не исполняет введённый Python. Другие способы проверяй запуском в своём редакторе и по числовому ответу. Пробелы между частями выражения и обычные одинарные или двойные кавычки допустимы.
Решено: 0 из 12
Сборка 1. Последний компьютер, затем сумма октетов
from ipaddress import ip_network
ip_net = ip_network(⟦1⟧, strict=⟦2⟧)
ip = ip_net[⟦3⟧]
octets = ⟦4⟧.split(⟦5⟧)
print(⟦6⟧)Программа собрана. Запусти её в Python и проверь результат ниже.
1. Какой ответ напечатала программа?
Введи одно итоговое число после запуска своего решения.
Сборка 2. Подсчёт всех адресов сети
from ipaddress import ip_network
ip_net = ip_network('10.0.0.0/255.255.255.248', strict=False)
count = ⟦1⟧
for ip in ⟦2⟧:
mas = str(ip).split('.')
ones = (bin(int(mas[0]))[2:].count('1')
+ bin(int(mas[1]))[2:].count('1')
+ bin(int(mas[2]))[2:].count('1')
+ bin(int(mas[3]))[2:].count('1'))
if ones % ⟦3⟧ ⟦4⟧ ⟦5⟧:
count += 1
print(⟦6⟧)Программа собрана. Запусти её в Python и проверь результат ниже.
2. Какой ответ напечатала программа?
Введи одно итоговое число после запуска своего решения.
Сборка 3. Подсчёт только компьютеров
from ipaddress import ip_network
ip_net = ip_network('10.0.0.0/255.255.255.248', strict=False)
count = ⟦1⟧
for ip in ⟦2⟧:
mas = str(ip).split('.')
ones = (bin(int(mas[0]))[2:].count('1')
+ bin(int(mas[1]))[2:].count('1')
+ bin(int(mas[2]))[2:].count('1')
+ bin(int(mas[3]))[2:].count('1'))
if ones % ⟦3⟧ ⟦4⟧ ⟦5⟧:
count += 1
print(⟦6⟧)Программа собрана. Запусти её в Python и проверь результат ниже.
3. Какой ответ напечатала программа?
Введи одно итоговое число после запуска своего решения.
Ещё девять вопросов по коду
Ответы можно исправлять и проверять снова.
4. Индекс broadcast
Какой индекс в ip_net выбирает последний адрес сети — broadcast?
5. Сумма октетов
Какой ответ нужен в первом разборе, если требуется сумма октетов наибольшего адреса компьютера?
6. Двоичный октет
Какую строку даст bin(16)[2:]? Впиши только цифры.
7. Единицы всего IP
Сколько единиц в двоичной записи 172.16.168.0?
8. Не кратно 5
У адреса ровно 10 единиц. Проходит ли он условие «число единиц не кратно 5»? Ответь «да» или «нет».
9. Весь диапазон или компьютеры
В подсети /29 восемь адресов. Сколько вернёт hosts() для компьютеров такой обычной подсети?
10. Число адресов /21
Сколько всех IPv4-адресов в сети с префиксом /21?
11. Граница диапазона
Какой IP является наибольшим адресом компьютера в сети первого разбора? Впиши адрес через точки.
12. Разрешить IP узла
Что указать после strict=, чтобы ip_network принял обычный IP узла? Напиши True или False.
Скачать Python и задания для самостоятельного решения
Четыре готовых файла: выбор адреса, подробный подсчёт единиц, короткий подсчёт и просмотр границ сети. В папке practice — три новых условия с местом для твоего кода; в solutions — решения для сверки после попытки.
Скачать учебные файлы PythonРаспакуй архив, открой нужный .py и запусти в Python 3. Дополнительные библиотеки и файлы данных не нужны.Если ответ не совпадает
| Что проверить | Как исправить |
|---|---|
| ValueError: has host bits set | В ip_network добавь strict=False или второй аргумент 0. |
| Для компьютера выбран broadcast | Проверь индекс: нужен −2, не −1. |
| Получен IP вместо требуемого числа | После выбора адреса вычисли сумму октетов, если спрашивается она. |
| Подсчёт отличается на один-два адреса | Проверь формулировку: весь диапазон или только компьютеры. Не вычитай 2 из готового count автоматически — крайние адреса могут не пройти условие. |
| Bin не принимает октет | Элемент mas — строка: сначала int(mas[i]). |
| Единицы посчитаны в 172.16.168.0 как в тексте | Требуется двоичная запись каждого октета или всего числового IP, а не десятичные символы. |
| Считаются кратные вместо некратных | Для «не кратно» нужен остаток != 0. |
| Неверное количество нулей | Для нулей дополни октеты до 8 бит или весь IPv4 до 32 бит. |
| Печатаются промежуточные количества | Итоговый print(count) должен стоять после цикла. |
Вопросы по решению кодом
Почему IP через точки нельзя передать в bin напрямую?
Bin принимает целое число. При разборе по октетам используй int(octet); если ip уже объект IPv4Address, int(ip) даст целое значение всего адреса.
Почему не нужно дописывать нули для числа единиц?
Ноль не меняет число единиц. Для количества нулей и проверки конкретных позиций разряды уже важны, поэтому нужна ширина 8 бит на октет или 32 на весь IPv4.
Работают ли правила двух служебных адресов для /31 и /32?
В этих примерах и тренажёре рассматриваются обычные подсети с префиксом не длиннее /30. В Python hosts() для /31 возвращает оба адреса, а для /32 — единственный. Поэтому индексы [1] и [-2] нельзя переносить на эти специальные случаи автоматически.
Справка: ipaddress в документации Python.
Где повторить нужный приём Python?
Открой учебник, повтори конкретный приём и вернись к самостоятельному решению. Здесь разобраны строки, которые нужны именно для задания 10.
Проверь, что можешь восстановить решение сам
Возьми условие из папки practice и напиши код в пустом файле. Перед запуском объясни себе каждое ограничение и последнюю строку ответа. Затем переходи к практике на новых заданиях.