Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/annatsepilova/goit-pycore-hw-03

tasks for learning Python
https://github.com/annatsepilova/goit-pycore-hw-03

python

Last synced: 4 days ago
JSON representation

tasks for learning Python

Awesome Lists containing this project

README

        

# Тема 4. Робота з датою, часом та розширена робота з рядками

## Завдання 1

Створіть функцію `get_days_from_today(date)`, яка розраховує кількість днів між заданою датою і поточною датою.

**Вимоги до завдання:**

- Функція приймає один параметр: `date` — рядок, що представляє дату у форматі `'РРРР-ММ-ДД'` (наприклад, `'2020-10-09'`).
- Функція повертає ціле число, яке вказує на кількість днів від заданої дати до поточної. Якщо задана дата пізніша за поточну, результат має бути від'ємним.
- У розрахунках необхідно враховувати лише дні, ігноруючи час (години, хвилини, секунди).
- Для роботи з датами слід використовувати модуль `datetime` Python.

**Рекомендації для виконання:**

- Імпортуйте модуль `datetime`.
- Перетворіть рядок дати у форматі `'РРРР-ММ-ДД'` у об'єкт `datetime`.
- Отримайте поточну дату, використовуючи `datetime.today()`.
- Розрахуйте різницю між поточною датою та заданою датою.
- Поверніть різницю у днях як ціле число.

**Критерії оцінювання:**

- Коректність роботи функції: функція повинна точно обраховувати кількість днів між датами.
- Обробка винятків: функція має впоратися з неправильним форматом вхідних даних.
- Читабельність коду: код повинен бути чистим і добре документованим.

**Приклад:**

Якщо сьогодні 5 травня 2021 року, виклик `get_days_from_today("2021-10-09")` повинен повернути `157`, оскільки 9 жовтня 2021 року є на 157 днів пізніше від 5 травня 2021 року.

## Завдання 2

Щоб виграти головний приз лотереї, необхідний збіг кількох номерів на лотерейному квитку з числами, що випали випадковим чином і в певному діапазоні під час чергового тиражу. Наприклад, необхідно вгадати шість чисел від 1 до 49 чи п'ять чисел від 1 до 36 тощо.

Вам необхідно написати функцію `get_numbers_ticket(min, max, quantity)`, яка допоможе генерувати набір унікальних випадкових чисел для таких лотерей. Вона буде повертати випадковий набір чисел у межах заданих параметрів, причому всі випадкові числа в наборі повинні бути унікальні.

**Вимоги до завдання:**

1. Параметри функції:

- **min** - мінімальне можливе число у наборі (не менше `1`).
- **max** - максимальне можливе число у наборі (не більше `1000`).
- **quantity** - кількість чисел, які потрібно вибрати (значення між `min` і `max`).

2. Функція генерує вказану кількість унікальних чисел у заданому діапазоні.
3. Функція повертає список випадково вибраних, відсортованих чисел. Числа в наборі не повинні повторюватися. Якщо параметри не відповідають заданим обмеженням, функція повертає пустий список.

**Рекомендації для виконання:**

- Переконайтеся, що вхідні параметри відповідають заданим обмеженням.
- Використовуйте модуль random для генерації випадкових чисел.
- Використовуйте множину або інший механізм для забезпечення унікальності чисел.
- Пам'ятайте, що функція `get_numbers_ticket` повертає відсортований список унікальних чисел.

**Критерії оцінювання:**

- Валідність вхідних даних: функція повинна перевіряти коректність параметрів.
- Унікальність результату: усі числа у видачі повинні бути унікальними.
- Відповідність вимогам: результат має бути у вигляді відсортованого списку.
- Читабельність коду: код має бути чистим і добре документованим.

**Приклад:**
Припустимо, вам потрібно вибрати `6` унікальних чисел для лотерейного квитка, де числа повинні бути у діапазоні від `1` до `49`.
Ви можете використати вашу функцію так:

```
lottery_numbers = get_numbers_ticket(1, 49, 6)
print("Ваші лотерейні числа:", lottery_numbers)
```

Цей код викликає функцію `get_numbers_ticket` з параметрами `min=1`, `max=49` та `quantity=6`.
В результаті ви отримаєте список з 6 випадковими, унікальними та відсортованими числами, наприклад, `[4, 15, 23, 28, 37, 45]`. Кожен раз при виклику функції ви отримуватимете різний набір чисел.

## Завдання 3

У вашій компанії ведеться активна маркетингова кампанія за допомогою SMS-розсилок. Для цього ви збираєте телефонні номери клієнтів із бази даних, але часто стикаєтеся з тим, що номери записані у різних форматах. Наприклад:

```
" +38(050)123-32-34"
" 0503451234"
"(050)8889900"
"38050-111-22-22"
"38050 111 22 11 "
```

Ваш сервіс розсилок може ефективно відправляти повідомлення лише тоді, коли номери телефонів представлені у коректному форматі. Тому вам необхідна функція, яка автоматично нормалізує номери телефонів до потрібного формату, видаляючи всі зайві символи та додаючи міжнародний код країни, якщо потрібно.

Розробіть функцію `normalize_phone(phone_number)`, що нормалізує телефонні номери до стандартного формату, залишаючи тільки цифри та символ `'+'` на початку. Функція приймає один аргумент - рядок з телефонним номером у будь-якому форматі та перетворює його на стандартний формат, залишаючи тільки цифри та символ `'+'`. Якщо номер не містить міжнародного коду, функція автоматично додає код `'+38'` (для України). Це гарантує, що всі номери будуть придатними для відправлення SMS.

**Вимоги до завдання:**

- Параметр функції `phone_number` - це рядок з телефонним номером у різноманітних форматах.
- Функція видаляє всі символи, крім цифр та символу `'+'`.
- Якщо міжнародний код відсутній, функція додає код `'+38'`. Це враховує випадки, коли номер починається з `'380'` (додається лише `'+'`) та коли номер починається без коду (додається `'+38'`).
- Функція повертає нормалізований телефонний номер у вигляді рядка.

**Рекомендації для виконання:**

- Використовуйте модуль `re` для регулярних виразів для видалення непотрібних символів.
- Перевірте, чи номер починається з `'+'`, і виправте префікс згідно з вказівками.
- Видаліть всі символи, крім цифр та `'+'`, з номера телефону.
- На забувайте повертати нормалізований номер телефону з функції.

**Критерії оцінювання:**

- Коректність роботи функції: функція має правильно обробляти різні формати номерів, враховуючи наявність або відсутність міжнародного коду.
- Читабельність коду: код має бути чистим, добре організованим і добре документованим.
- Правильне використання регулярних виразів для видалення зайвих символів та форматування номера.

**Приклад використання:**

```
raw_numbers = [
"067\\t123 4567",
"(095) 234-5678\\n",
"+380 44 123 4567",
"380501234567",
" +38(050)123-32-34",
" 0503451234",
"(050)8889900",
"38050-111-22-22",
"38050 111 22 11 ",
]

sanitized_numbers = [normalize_phone(num) for num in raw_numbers]
print("Нормалізовані номери телефонів для SMS-розсилки:", sanitized_numbers)
```

У результаті ви повинні отримати список номерів у стандартному форматі, готових до використання у SMS-розсилці.

```
Нормалізовані номери телефонів для SMS-розсилки:
['+380671234567', '+380952345678', '+380441234567',
'+380501234567', '+380501233234', '+380503451234',
'+380508889900', '+380501112222', '+380501112211']
```

## Завдання 4

У межах вашої організації, ви відповідаєте за організацію привітань колег з днем народження. Щоб оптимізувати цей процес, вам потрібно створити функцію `get_upcoming_birthdays`, яка допоможе вам визначати, кого з колег потрібно привітати. Функція повинна повернути список всіх у кого день народження вперед на 7 днів включаючи поточний день.

У вашому розпорядженні є список `users`, кожен елемент якого містить інформацію про ім'я користувача та його день народження. Оскільки дні народження колег можуть припадати на вихідні, ваша функція також повинна враховувати це та переносити дату привітання на наступний робочий день, якщо необхідно.

**Вимоги до завдання:**

- Параметр функції `users` - це список словників, де кожен словник містить ключі `name` (ім'я користувача, рядок) та `birthday` (день народження, рядок у форматі 'рік.місяць.дата').
- Функція має визначати, чиї дні народження випадають вперед на 7 днів включаючи поточний день. Якщо день народження припадає на вихідний, дата привітання переноситься на наступний понеділок.
- Функція повертає список словників, де кожен словник містить інформацію про користувача (ключ `name`) та дату привітання (ключ `congratulation_date`, дані якого у форматі рядка `'рік.місяць.дата'`).

**Рекомендації для виконання:**

- Припускаємо, що ви отримали список `users`, де кожен словник містить `name` (ім'я користувача) та `birthday` (дата народження у форматі рядка `'рік.місяць.дата'`). Ви повинні перетворити дати народження з рядків у об'єкти `datetime`. Конвертуйте дату народження із рядка у `datetime` об'єкт - `datetime.strptime(user["birthday"], "%Y.%m.%d").date()`. Оскільки потрібна лише дата (без часу), використовуйте `.date()` для отримання тільки дати.
- Визначте поточну дату системи за допомогою `datetime.today().date()`.
- Пройдіться по списку `users` та аналізуйте дати народження кожного користувача (`for user in users:`).
- Перевірте, чи вже минув день народження в цьому році (`if birthday_this_year < today`). Якщо так, розгляньте дату на наступний рік.
- Визначте різницю між днем народження та поточним днем для визначення днів народження на наступний тиждень.
- Перевірте, чи день народження припадає на вихідний. Якщо так, перенесіть дату привітання на наступний понеділок.
- Створіть структуру даних, яка зберігатиме ім'я користувача та відповідну дату привітання, якщо день народження відбувається протягом наступного тижня.
- Виведіть зібрані дані у вигляді списку словників з іменами користувачів та датами привітань.

**Критерії оцінювання:**

- Актуальність та коректність визначення днів народження на 7 днів вперед.
- Правильність обробки випадків, коли дні народження припадають на вихідні.
- Читабельність та структурованість коду.

**Приклад:**

Припустимо, у вас є список `users`:

```
users = [
{"name": "John Doe", "birthday": "1985.01.23"},
{"name": "Jane Smith", "birthday": "1990.01.27"}
]
```

Використання функції `get_upcoming_birthdays`:

```
upcoming_birthdays = get_upcoming_birthdays(users)
print("Список привітань на цьому тижні:", upcoming_birthdays)
```

Якщо сьогодні `2024.01.22` результатом може бути:

```
[
{'name': 'John Doe', 'congratulation_date': '2024.01.23'},
{'name': 'Jane Smith', 'congratulation_date': '2024.01.29'}
]
```

Цей список містить інформацію про те, кого і коли потрібно привітати з днем народження.