Как работает __init__.py?
1. Питон может искать модули в нескольких папких в порядке очередности (в том числе по путям в PYTHON_PATH).
2. Представьте что по одному из путей у вас вот так:
а по другому вот так:
3. Вы импортируете модуль string, но первой по приоритету обрабатывается директория с папкой string. А у вас там например вообще не питоновский код, а документация какая-нибудь. Вы на самом деле хотите заимпортить string.py из второй папки, но интерпретатор будет думать что нужно взять директорию, и выдаст ошибку (скажет что мол не является это валидным пакетом или что-то в таком духе).
4. Чтобы такого не было, разработчики решили что вы должны явно помечать, что хотите чтобы папка считалась пакетом. Это тоже самое что помечать файлы с кодом на питоне расширением .py - вы же не ждёте что интерпретатор будет воспринимать .txt-шники как модули на питоне? То же самое и с папкой.
Ну и да, как уже упомянул Вячеслав , __init__.py вовсе не обязательно должен быть пустым, например там могут быть реэкспорты.
Если в папке нет __init__.py то это не пакет.
Грубо говоря, __init__.py  нужен для того что бы можно было загружать именно пакет и модель работы пакетов функционировала.import package1
from package1.sub_package1 import *