Python · Синтаксис · Начальный уровень

ООП, словари, алгоритмическое мышление

15 задач

Упражнения по Python на ООП, словари и алгоритмическое мышление: классы для анализа данных, подсчёт слов и символов, работа с оценками, паролями, статистикой и преобразованием словарей.

Словари как состояние класса

#
Когда класс должен отслеживать переменное количество элементов — оценки многих студентов, очки многих игроков, товары в инвентаре — словарь, хранящийся в self, является правильным инструментом. Отдельный атрибут на каждый элемент не масштабируется. ```python class GradeBook: def __init__(self): self.grades = {} def add(self, name, grade): if name not in self.grades: self.grades[name] = [] self.grades[name].append(grade) def average(self, name): grades = self.grades.get(name, []) if not grades: return 0 return sum(grades) / len(grades) ``` self.grades инициализируется как пустой словарь в __init__. Методы читают и записывают в него. Словарь растёт с каждым вызовом add() — классу не нужно знать заранее, сколько будет студентов. dict.get(key, default) возвращает значение для key, если оно существует, или default — без выброса KeyError. Это безопаснее прямого доступа, когда ключ может отсутствовать. Для классов, которые просто считают вхождения — частота слов, количество букв — обычный словарь с целочисленными значениями подходит хорошо: ```python class WordCounter: def __init__(self, text): self.text = text def count(self): result = {} for word in self.text.split(): result[word] = result.get(word, 0) + 1 return result ``` result.get(word, 0) + 1 — стандартная идиома подсчёта в словаре: получаем текущий счётчик (по умолчанию 0, если отсутствует) и добавляем 1.

Паттерны реестра, счётчика и агрегатора

#
Реестр, предотвращающий дубликаты — храним зарегистрированные имена в множестве, проверяем перед добавлением: ```python class UserRegistry: def __init__(self): self.users = set() def register(self, username): if username in self.users: return False self.users.add(username) return True ``` Класс с балансом, соблюдающий правило — не позволяет снимать больше, чем есть: ```python class BankAccount: def __init__(self): self.balance = 0 def deposit(self, amount): self.balance += amount def withdraw(self, amount): if amount > self.balance: return False self.balance -= amount return True ``` Поиск лучшего игрока — итерируем по словарю, отслеживаем ключ с максимальным значением: ```python class ScoreTable: def __init__(self): self.scores = {} def add(self, name, points): self.scores[name] = self.scores.get(name, 0) + points def top_player(self): return max(self.scores, key=self.scores.get) ``` max(dict, key=dict.get) находит ключ, соответствующее значение которого наибольшее. Это идиоматичный Python для "какой ключ имеет наибольшее значение".

Быстрый справочник: словари, множества и паттерны классов

#
**Операции со словарём** ```python d = {} # пустой словарь d[ключ] = значение # установить / обновить d[ключ] # получить — KeyError если отсутствует d.get(ключ) # получить — None если отсутствует d.get(ключ, по_умолч) # получить — по_умолч если отсутствует ключ in d # True если ключ существует del d[ключ] # удалить ключ d.keys() # все ключи d.values() # все значения d.items() # пары (ключ, значение) ``` **Идиома подсчёта** ```python # Посчитать вхождения каждого слова counts = {} for word in text.split(): counts[word] = counts.get(word, 0) + 1 # То же с setdefault: counts.setdefault(word, 0) counts[word] += 1 ``` **Операции с множеством для реестров** ```python s = set() # пустое множество — дубликаты не допускаются s.add(элемент) # добавить элемент элемент in s # проверка членства — O(1) s.remove(элемент) # удалить — KeyError если отсутствует s.discard(элемент)# удалить — молча если отсутствует ``` **Паттерны классов с использованием словарей** ```python # Накапливать значения по ключу self.data.setdefault(ключ, []).append(значение) # Считать по ключу self.counts[ключ] = self.counts.get(ключ, 0) + 1 # Найти ключ с наибольшим значением max(self.scores, key=self.scores.get) # Перебрать все записи for name, score in self.scores.items(): print(name, score) # Проверить перед вставкой (паттерн реестра) if ключ not in self.data: self.data[ключ] = начальное_значение ```
01

WordCounter для текста.

#

Создайте класс WordCounter , который принимает строку текста. Добавьте метод count , который возвращает словарь, где: - ключ — слово - значение — сколько раз оно встречается в тексте

class WordCounter:
    pass
Решение
class WordCounter:
    def __init__(self, text):
        self.text = text

    def count(self):
        result = {}
        words = self.text.split()
        for w in words:
            if w in result:
                result[w] += 1
            else:
                result[w] = 1
        return result
02

Журнал оценок GradeBook.

#

Создайте класс GradeBook . Метод add(name, grade) добавляет оценку ученику. Метод average(name) возвращает среднюю оценку ученика.

class GradeBook:
    pass
Решение
class GradeBook:
    def __init__(self):
        self.data = {}

    def add(self, name, grade):
        if name not in self.data:
            self.data[name] = []
        self.data[name].append(grade)

    def average(self, name):
        grades = self.data.get(name, [])
        if not grades:
            return 0
        return sum(grades) / len(grades)
03

Подсчёт каждой буквы.

#

Напишите функцию, которая принимает строку и возвращает словарь с количеством каждой буквы.

def letter_stats(text):
    pass
Решение
def letter_stats(text):
    result = {}
    for ch in text:
        if ch.isalpha():
            ch = ch.lower()
            if ch in result:
                result[ch] += 1
            else:
                result[ch] = 1
    return result
04

Проверка надёжности пароля.

#

Создайте класс PasswordChecker . Метод check возвращает True , если пароль: - длина ≥ 8 - есть хотя бы одна цифра

class PasswordChecker:
    pass
Решение
class PasswordChecker:
    def check(self, password):
        if len(password) < 8:
            return False

        has_digit = False
        for ch in password:
            if ch.isdigit():
                has_digit = True
                break

        return has_digit
05

Инвентарь товаров.

#

Создайте класс Inventory . Метод add_item(name, count) добавляет товар. Метод total_items() возвращает общее количество всех товаров.

class Inventory:
    pass
Решение
class Inventory:
    def __init__(self):
        self.items = {}

    def add_item(self, name, count):
        if name in self.items:
            self.items[name] += count
        else:
            self.items[name] = count

    def total_items(self):
        total = 0
        for c in self.items.values():
            total += c
        return total
06

Группировка слов по длине.

#

Напишите функцию, которая принимает список слов и возвращает словарь: - ключ — длина слова - значение — сколько слов такой длины

def length_groups(words):
    pass
Решение
def length_groups(words):
    result = {}
    for w in words:
        l = len(w)
        if l in result:
            result[l] += 1
        else:
            result[l] = 1
    return result
07

BankAccount без минуса.

#

Создайте класс BankAccount с методами: - deposit(amount) - withdraw(amount) — не даёт уйти в минус

class BankAccount:
    pass
Решение
class BankAccount:
    def __init__(self, balance=0):
        self.balance = balance

    def deposit(self, amount):
        self.balance += amount

    def withdraw(self, amount):
        if amount <= self.balance:
            self.balance -= amount
            return True
        return False
08

Гласные и согласные.

#

Напишите функцию, которая принимает строку и возвращает словарь с количеством гласных и согласных букв.

def vowels_and_consonants(text):
    pass
Решение
def vowels_and_consonants(text):
    vowels = "aeiouy"
    result = {"vowels": 0, "consonants": 0}

    for ch in text.lower():
        if ch.isalpha():
            if ch in vowels:
                result["vowels"] += 1
            else:
                result["consonants"] += 1

    return result
09

Регистрация пользователей.

#

Создайте класс UserRegistry . Метод register(username) : - возвращает True , если пользователь добавлен - False , если такой уже есть

USERS = []

class UserRegistry:
    pass
Решение
USERS = []

class UserRegistry:
    def register(self, username):
        if username in USERS:
            return False
        USERS.append(username)
        return True
10

Классификация чисел.

#

Напишите функцию, которая принимает список чисел и возвращает словарь: - "positive" - "negative" - "zero"

def number_summary(nums):
    pass
Решение
def number_summary(nums):
    result = {"positive": 0, "negative": 0, "zero": 0}

    for n in nums:
        if n > 0:
            result["positive"] += 1
        elif n < 0:
            result["negative"] += 1
        else:
            result["zero"] += 1

    return result
11

Корзина покупок.

#

Создайте класс ShoppingCart . Метод add(product, price) добавляет товар. Метод total() возвращает сумму всех цен.

class ShoppingCart:
    pass
Решение
class ShoppingCart:
    def __init__(self):
        self.items = {}

    def add(self, product, price):
        self.items[product] = price

    def total(self):
        total = 0
        for p in self.items.values():
            total += p
        return total
12

Позиция первого появления символа.

#

Напишите функцию, которая принимает строку и возвращает словарь, где ключ — символ, значение — позиция его первого появления в строке.

def first_positions(text):
    pass
Решение
def first_positions(text):
    result = {}
    for i in range(len(text)):
        if text[i] not in result:
            result[text[i]] = i
    return result
13

Таблица очков игроков.

#

Создайте класс ScoreTable . Метод add(name, points) добавляет очки игроку. Метод top_player() возвращает имя игрока с максимальным счётом.

class ScoreTable:
    pass
Решение
class ScoreTable:
    def __init__(self):
        self.scores = {}

    def add(self, name, points):
        if name in self.scores:
            self.scores[name] += points
        else:
            self.scores[name] = points

    def top_player(self):
        if not self.scores:
            return None
        top = None
        max_score = -1
        for name, score in self.scores.items():
            if score > max_score:
                max_score = score
                top = name
        return top
14

Обмен ключей и значений.

#

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

def swap_dict(d):
    pass
Решение
def swap_dict(d):
    result = {}
    for k, v in d.items():
        result[v] = k
    return result
15

Анализатор текста.

#

Создайте класс TextAnalyzer . Метод analyze возвращает словарь: - "chars" — количество символов - "words" — количество слов - "lines" — количество строк

class TextAnalyzer:
    pass
Решение
class TextAnalyzer:
    def __init__(self, text):
        self.text = text

    def analyze(self):
        chars = len(self.text)
        lines = self.text.count("\n") + 1 if self.text else 0
        words = len(self.text.split())

        return {
            "chars": chars,
            "words": words,
            "lines": lines
        }