Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions lesson_2/hometask/task_1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import datetime

# Создать список и заполнить его элементами различных типов данных.
# Реализовать скрипт проверки типа данных каждого элемента.
# !!!(Что значит "проверки типов данных"? У нас разве есть ограничения??)
# Использовать функцию type() для проверки типа.
# Элементы списка можно не запрашивать у пользователя, а указать явно, в программе.

# задам априори, так как типов данных куча, писать ifы лень))
mylist = ["iron maiden", 666, "the number of the beast", 4.85, datetime.date(1982, 3, 22)]

for element in mylist:
print(f"{element} has a type {type(element)}")

# !!!(Что значит "проверки типов данных"? У нас разве есть ограничения??)
# пусть есть
# множество с допустимыми значениями
allow_types_set = frozenset((type(int()), type(str()), type(float())))
for element in mylist:
element_type = type(element)
if element_type not in allow_types_set:
mylist.remove(element)
print(f"element {element} has a not allowed type {element_type}")
20 changes: 20 additions & 0 deletions lesson_2/hometask/task_2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import datetime

# Для списка реализовать обмен значений соседних элементов,
# т.е. Значениями обмениваются элементы с индексами 0 и 1, 2 и 3 и т.д.
# При нечетном количестве элементов последний сохранить на своем месте.
# Для заполнения списка элементов необходимо использовать функцию input()

my_list = []
while True:
x = input("Enter list value. If no value entered, list ends >>>")
if x == "":
break
my_list.append(x)

print(f"entered list is {my_list}")
# нас интересующие индексы чётных элементов
for indx in range(0, (len(my_list)//2)*2, 2):
my_list[indx], my_list[indx + 1] = my_list[indx + 1], my_list[indx]

print(f"result list is {my_list}")
30 changes: 30 additions & 0 deletions lesson_2/hometask/task_3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Пользователь вводит месяц в виде целого числа от 1 до 12.
# Сообщить к какому времени года относится месяц (зима, весна, лето, осень).
# Напишите решениЯ через list и через dict.

number = None

while True:
try:
number = int(input("Enter number in range from 1 to 12 >>>"))
if number in range(1, 12):
break
except ValueError:
continue
# решение через dict
# кортежи - хэшируемый тип данных
seasons_dict = {(12, 1, 2): "winter", (3, 4, 5): "spring", (6, 7, 8): "summer", (9, 10, 11): "autumn/fall"}
for month_numbers, name in seasons_dict.items():
if number in month_numbers:
print(f"month with number {number} is {name}")
# больше исследовать нечего
break

# решение через list
seasons_name_list = ["winter", "spring", "summer", "autumn/fall"]
seasons_month_list = [(12, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11)]
for month_numbers, name in zip(seasons_month_list, seasons_name_list):
if number in month_numbers:
print(f"month with number {number} is {name}")
# больше исследовать нечего
break
9 changes: 9 additions & 0 deletions lesson_2/hometask/task_4.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Пользователь вводит строку из нескольких слов, разделённых пробелами.
# Вывести каждое слово с новой строки.
# Строки необходимо пронумеровать.
# Если в слово длинное, выводить только первые 10 букв в слове.

# Пользователь может ввести что угодно
word_list = input("Enter an ordinary string >>>").split()
for number, word in enumerate(word_list, 1):
print(f"{number} {word:.10}")
36 changes: 36 additions & 0 deletions lesson_2/hometask/task_5.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Реализовать структуру «Рейтинг», представляющую собой
# не возрастающий набор натуральных чисел.
# У пользователя необходимо запрашивать новый элемент рейтинга.
# Если в рейтинге существуют элементы с одинаковыми значениями,
# то новый элемент с тем же значением должен разместиться после них.
#
# **Подсказка.** Например, набор натуральных чисел: 7, 5, 3, 3, 2.
# Пользователь ввел число 3. Результат: 7, 5, 3, 3, 3, 2.
# Пользователь ввел число 8. Результат: 8, 7, 5, 3, 3, 2.
# Пользователь ввел число 1. Результат: 7, 5, 3, 3, 2, 1.
#
# Набор натуральных чисел можно задать непосредственно в коде, например, my_list = [7, 5, 3, 3, 2].

# "...новый элемент...должен разместиться после них..." - значит,
# просто добавить элемент и сортировать список - не то, что требуется.

my_list = [7, 5, 3, 3, 2]
number = None

while True:
try:
number = int(input("Enter natural number >>>"))
if number >= 0:
break
except ValueError:
continue
if len(my_list) == 0:
my_list.append(number)
elif number > my_list[0]:
my_list.insert(0, number)
else:
for indx in range(len(my_list) - 1, -1, -1):
if number <= my_list[indx]:
my_list.insert(indx + 1, number)
break
print(my_list)
70 changes: 70 additions & 0 deletions lesson_2/hometask/task_6.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# *Реализовать структуру данных «Товары».
# Она должна представлять собой список кортежей.
# Каждый кортеж хранит информацию об отдельном товаре.
# В кортеже должно быть два элемента — номер товара и словарь с параметрами
# (характеристиками товара: название, цена, количество, единица измерения).
# Структуру нужно сформировать программно, т.е. запрашивать все данные у пользователя.
# **Пример готовой структуры:**
# [
# (1, {“название”: “компьютер”, “цена”: 20000, “количество”: 5, “eд”: “шт.”}),
# (2, {“название”: “принтер”, “цена”: 6000, “количество”: 2, “eд”: “шт.”}),
# (3, {“название”: “сканер”, “цена”: 2000, “количество”: 7, “eд”: “шт.”})
# ]
# Необходимо собрать аналитику о товарах.
# Реализовать словарь, в котором каждый ключ — характеристика товара,
# например название, а значение — список значений-характеристик, например список названий товаров.
# **Пример:**
# {
# “название”: [“компьютер”, “принтер”, “сканер”],
# “цена”: [20000, 6000, 2000],
# “количество”: [5, 2, 7],
# “ед”: [“шт.”]
# }

product_list = list()
# Запрашиваем данные у пользователя
while True:
try:
number = int(input("Enter the product number >>>"))
double_mark = False
# стоило бы добавить проверку дубляжей...
for item in product_list:
if item[0] == number:
double_mark = True
break
if double_mark:
print(f"Number {number} already in list")
continue
name = input("Enter the product name >>>")
price = float(input("Enter the product price >>>"))
count = int(input("Enter the product count >>>"))
value_measure = input("Enter the product measure >>>")
except ValueError as verror:
print(f"{verror}, uncorrect value")
continue
except EOFError as eof_error:
print(f"{eof_error}, now quit")
quit()
if name == "" or value_measure == "" or price < 0 or count < 0 or number < 0:
print(f"uncorrect values detected, reenter please")
continue
product_list.append((number, {'name': name, 'price': price, 'count': count, 'measure': value_measure}))
if input("Press Enter to continue or something else to break >>>") == "":
break
print(product_list)

# Теперь парсим словарь в другой словарь
unique_dict = dict()
for values in product_list:
if len(values) < 2:
continue
product_dict = values[1]
if type(product_dict) is not dict:
continue
for key, value in product_dict.items():
unique_list = unique_dict.setdefault(key, list())
# судя по примеру, в массиве должны быть только уникальные значения
if value not in unique_list:
unique_list.append(value)

print(unique_dict)
33 changes: 33 additions & 0 deletions lesson_3/hometask/hometask_1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Реализовать функцию, принимающую два числа (позиционные аргументы)
# и выполняющую их деление. Числа запрашивать у пользователя,
# предусмотреть обработку ситуации деления на ноль.

# нас интересуют только позиционные аргументы
# ни о каких именованных и позиционных аргументах речь не идёт!
def divide_numbers(num_1, num_2, /):
"""
Функция вычисления частного от деления одного числа на другое

:param num_1: делимое
:param num_2: делитель
:return: результат деления делимого на делитель или None
"""
try:
return num_1 / num_2
except ZeroDivisionError:
return None


divident = float()
denominator = float()
while True:
try:
divident = float(input("Введите числитель дроби:"))
denominator = float(input("Введите знаменатель дроби:"))
break
except ValueError:
continue

print(f"{divident}/{denominator}={divide_numbers(divident, denominator)}")
# Тут будет ошибка! Так как аргументы строго позиционные
# print(f"{divident}/{denominator}={divide_numbers(num1 = divident, num2 = denominator)}")
36 changes: 36 additions & 0 deletions lesson_3/hometask/hometask_2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Реализовать функцию, принимающую несколько параметров, описывающих данные пользователя:
# имя, фамилия, год рождения, город проживания, email, телефон.
# Функция должна принимать параметры как именованные аргументы.
# Реализовать вывод данных о пользователе одной строкой.

import datetime


# Только именованные аргументы!
# значения по умолчанию не придумал)
def get_user_data(*, name, surname, birthdate, location, email=None, phone=None):
"""
Возвращает информацию о пользователе на основе задаваемых данных.

:param name: имя пользователя
:param surname: фамилия пользователя
:param birthdate: дата рождения пользователя
:param location: местоположение пользователя
:param email: электронная почта пользователя
:param phone: телефон пользователя
:return: информация о пользователе в одной строке
"""
return f"Oh that obnoxious user {name} {surname}! " \
f"He was born in {birthdate}. " \
f"Now {name} located on {location}. " \
f"You may reach {name} by phone {phone} or email {email}"


print(get_user_data(name="Louis", birthdate=datetime.date(year=1973, month=2, day=11),
surname="Cachet", location="Demont",
phone="+33-61-666-14-88", email="christian@jw.fr"))

# ошибка!
# print(get_user_data("Louis", birthdate=datetime.date(year=1973, month=2, day=11),
# surname="Cachet", location="Demont",
# phone="+33-61-666-14-88", email="christian@jw.fr"))
48 changes: 48 additions & 0 deletions lesson_3/hometask/hometask_3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Реализовать функцию my_func(), которая
# принимает три позиционных аргумента, и
# возвращает сумму наибольших двух аргументов.
import math


# вспомогательная функция
def calc_sum(*args):
"""
Вычисляет сумму задаваемых чисел.
При некорректном типе аргументов возвращает минус бесконечность

:param args: задаваемые числа
:return: сумму задаваемых чисел или -math.inf
"""
try:
return sum(args)
except TypeError:
return -math.inf


# нас интересуют только позиционные аргументы,
# ни о каких именованных и позиционных аргументах речь не идёт!
def my_func(arg_1, arg_2, arg_3, /):
"""
Вычисляет сумму наибольших двух аргументов.
При некорректном типе двух задаваемых аргументов возвращает минус бесконечность

:param arg_1: некое целое или дробное число
:param arg_2: некое целое или дробное число
:param arg_3: некое целое или дробное число
:return: сумму наибольших двух аргументов или -math.inf
"""
return max(calc_sum(arg_1, arg_2),
calc_sum(arg_1, arg_3),
calc_sum(arg_2, arg_3))


def lazy_print(arg_1, arg_2, arg_3):
print(f"Max sum of two elements "
f" between {arg_1}, {arg_2}, {arg_3} is "
f"{my_func(arg_1, arg_2, arg_3)}")


lazy_print('ahh', 2, 3)
lazy_print(3, 1, 4)
lazy_print(3.13, 5, 9.11)
lazy_print('ahh', 'fggh', 3)
Loading