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
        }