Skip to content

Latest commit

 

History

History
218 lines (181 loc) · 6.35 KB

EXAM_TASKS.md

File metadata and controls

218 lines (181 loc) · 6.35 KB

Практические задачи для экзамена по Python Advanced

15 задач по всему профи-курсу.

Задача 1. Декоратор для замера времени

Условие: Напишите декоратор, который замеряет время работы функции. Решение:

import time
import functools

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        print(f'Время: {time.time() - start:.4f} сек')
        return result
    return wrapper

Задача 2. Магический метод str

Условие: Создайте класс Book с полями title и author. Переопределите str, чтобы книга красиво выводилась через print. Решение:

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

    def __str__(self):
        return f'{self.title} (автор: {self.author})'

Задача 3. Свойства (@property)

Условие: Создайте класс Temperature с приватным полем _celsius. Добавьте свойство fahrenheit для перевода. Решение:

class Temperature:
    def __init__(self, celsius):
        self._celsius = celsius

    @property
    def fahrenheit(self):
        return self._celsius * 9/5 + 32

Задача 4. @dataclass

Условие: Опишите структуру Point (x, y) с помощью @dataclass и создайте два объекта. Решение:

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

p1 = Point(1, 2)
p2 = Point(1, 2)
print(p1 == p2)  # True

Задача 5. Генератор чисел Фибоначчи

Условие: Напишите генератор, который выдает N чисел Фибоначчи. Решение:

def fib(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

for x in fib(5):
    print(x)

Задача 6. Валидация Pydantic

Условие: Создайте модель User (name: str, age: int). Проверьте валидацию на неверных данных. Решение:

from pydantic import BaseModel, ValidationError

class User(BaseModel):
    name: str
    age: int

try:
    user = User(name='Иван', age='двадцать')
except ValidationError as e:
    print('Ошибка валидации:', e)

Задача 7. Работа с файлами (JSON)

Условие: Запишите словарь в JSON-файл и прочитайте его обратно. Решение:

import json

data = {'name': 'Alice', 'age': 25}
with open('data.json', 'w') as f:
    json.dump(data, f)

with open('data.json', 'r') as f:
    loaded = json.load(f)
    print(loaded['name'])

Задача 8. Асинхронный запрос (asyncio)

Условие: Напишите асинхронную функцию, которая делает 3 паузы по 1 секунде параллельно. Решение:

import asyncio

async def task(name):
    await asyncio.sleep(1)
    print(f'{name} готов')

async def main():
    await asyncio.gather(task('A'), task('B'), task('C'))

asyncio.run(main())

Задача 9. Многопоточность

Условие: Запустите 2 функции, имитирующие долгую работу, в разных потоках. Решение:

import threading
import time

def work(name):
    time.sleep(2)
    print(f'{name} завершен')

t1 = threading.Thread(target=work, args=('Поток 1',))
t2 = threading.Thread(target=work, args=('Поток 2',))
t1.start(); t2.start()
t1.join(); t2.join()

Задача 10. Тестирование (pytest)

Условие: Напишите функцию multiply(a, b) и тест к ней с параметризацией. Решение:

import pytest

def multiply(a, b):
    return a * b

@pytest.mark.parametrize('a, b, expected', [
    (2, 3, 6),
    (0, 5, 0),
    (-2, 4, -8)
])
def test_multiply(a, b, expected):
    assert multiply(a, b) == expected

Задача 11. Свой класс исключения

Условие: Создайте ошибку NegativeAgeError и функцию check_age, которая ее выбрасывает. Решение:

class NegativeAgeError(Exception):
    pass

def check_age(age):
    if age < 0:
        raise NegativeAgeError('Возраст не может быть отрицательным')

Задача 12. Работа со списками (List Comprehension)

Условие: Дан список чисел. Создайте новый список из квадратов четных чисел. Решение:

nums = [1, 2, 3, 4, 5, 6]
result = [x * x for x in nums if x % 2 == 0]
print(result)  # [4, 16, 36]

Задача 13. Генераторное выражение

Условие: Создайте генератор, который возвращает кубы чисел от 1 до 1000 (не храня их в памяти). Решение:

cubes = (x ** 3 for x in range(1, 1001))
for c in cubes:
    if c > 100:
        break
    print(c)

Задача 14. Функция с *args и **kwargs

Условие: Напишите функцию, которая принимает любое количество аргументов и выводит их типы. Решение:

def show_types(*args, **kwargs):
    for a in args:
        print(type(a))
    for k, v in kwargs.items():
        print(k, type(v))

Задача 15. Комбинированная (FastAPI)

Условие: Напишите эндпоинт FastAPI, который принимает имя и возвращает приветствие. Решение:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    name: str

@app.post('/hello')
def hello(user: User):
    return {'message': f'Привет, {user.name}'}