Слайд 1: Основы работы с модулями

Теория: Модули в Python

Модули позволяют организовать код в отдельные файлы для лучшей структуры программы и повторного использования кода.

1. Структура проекта:

genshin_calculator/ ├── characters/ │ ├── __init__.py │ ├── character.py │ └── talents.py ├── combat/ │ ├── __init__.py │ └── damage.py └── main.py

2. Способы импорта:

# Импорт всего модуля
import combat.damage
result = combat.damage.calculate_crit(1500, 50.0)

# Импорт конкретной функции
from combat.damage import calculate_crit
result = calculate_crit(1500, 50.0)

# Импорт с псевдонимом
import combat.damage as dmg
result = dmg.calculate_crit(1500, 50.0)

# Импорт нескольких элементов
from characters.talents import (
    normal_attack_dmg,
    skill_dmg,
    burst_dmg
)

3. Создание модуля:

# combat/damage.py

"""
Модуль для расчёта урона.
Содержит функции для вычисления разных типов урона.
"""

def calculate_crit(base_dmg: float, crit_rate: float) -> float:
    """Рассчитывает критический урон"""
    return base_dmg * (1 + crit_rate/100)

def calculate_reaction(base_dmg: float, em: int) -> float:
    """Рассчитывает урон элементальной реакции"""
    em_bonus = em * 0.0016
    return base_dmg * (1 + em_bonus)

# Указываем, что можно импортировать из модуля
__all__ = ['calculate_crit', 'calculate_reaction']

4. Использование модуля:

# main.py
from combat.damage import calculate_crit
from characters.character import Character
from characters.talents import normal_attack_dmg

# Создаём персонажа
venti = Character("Венти", "Анемо")

# Рассчитываем урон
base_damage = normal_attack_dmg(venti.attack, venti.talent_level)
crit_damage = calculate_crit(base_damage, venti.crit_rate)

Важно помнить:

  • Модуль - это просто файл с расширением .py
  • Импортированный модуль выполняется один раз
  • __all__ определяет, что импортируется при from module import *
  • Рекомендуется использовать конкретные импорты вместо *
  • Циклические импорты могут вызвать проблемы

Задача: Система расчёта урона

Создайте систему модулей для расчёта урона персонажей:

Подсказка: Пример организации модулей:

# base_stats.py
"""Базовые расчёты характеристик"""

__all__ = ['calculate_base_dmg', 'calculate_def']

def calculate_base_dmg(atk: float, multiplier: float) -> float:
    """Базовый расчёт урона"""
    return atk * multiplier

# reactions.py
"""Элементальные реакции"""

from .base_stats import calculate_base_dmg

__all__ = ['calculate_vaporize', 'calculate_melt']

def calculate_vaporize(base_dmg: float, em: int) -> float:
    """Расчёт урона пара"""