print("-------------------------------------------- Задание 1 (77)")

'''
Создадим пустую функцию которая ничего не возвращает.
'''


def func1():
    print("[Простая функция]")


func1()

print("-------------------------------------------- Задание 2 (77)")

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


# 1-ый Способ
def func2(a):
    print("[Функция с аргументом] a =", a, "умноженное на 2 равно:", a * 2)
    return 0


func2(5)  # = None
print(func2(5))


# 2-ый Способ
def func2(a):
    return a * 2


# print("Ответ:", func2(5))


print("-------------------------------------------- Задание 3 (77)")

'''
Напишем функцию, которая определяет параметр на чётность. Если чётное число принтим (‘yes’) в ином случае (‘no’).
'''


def func3(a):
    if a % 2 == 0:
        res = "yes"
    else:
        res = "no"
    print("[Функция с аргументом]", a, "Четное число?", res)


func3(8)
func3(7)
func3(3)
func3(0)

print("-------------------------------------------- Задание 4 (78)")

'''
Пишем функцию, принимающую два аргумента. После чего проверим, если первое число больше второго,
принтим (‘да’). Если меньше(‘нет’).
'''


def func4(a, b):
    if a > b:
        res = "yes"
    else:
        res = "no"
    print("[Функция с 2-умя аргументами]", a, ">", b, res)


func4(15, 10)

print("-------------------------------------------- Задание 5 (78)")

'''
Написать лямбда функцию, которая делит по модулю(%) два аргумента.
'''

func5 = lambda a, b: (a % 2, b % 2)
print("[Деление по модулю]", func5(5, 20))
print("[Деление по модулю]", func5(6, 16))

print("-------------------------------------------- Задание 6 (79)")

'''
Создадим функцию с простыми командами. Обернём её в декоратор, который бы дополнял возможности функции.
'''


def decorator(func):
    def wrapper():
        print("1.Текс которым дополнили (обернули нашу функцию)")
        func()
        print("2.Текс которым дополнили (обернули нашу функцию)")

    return wrapper


@decorator
def show():
    print("0.Текст функции")


show()

print("-------------------------------------------- Задание 7 (79)")

'''
Использовать функцию map и filter 
'''

numbers = [1, 2, 3, 4, 5]
MultiplyBy2 = lambda x: x * 2
numbers_result = list(map(MultiplyBy2, numbers))  # Map = [2, 4, 6, 8, 10]
print("ИСХ: numbers =", numbers, "и Функция: MultiplyBy2 (x * 2)")
print("РЕЗ: list(map(MultiplyBy2, numbers)) =", numbers_result)

numbers = [1, 2, 3, 4, 5]
MoreThan3 = lambda x: (x > 3)
numbers_result = list(filter(MoreThan3, numbers))  # Filter = [4, 5]
print("ИСХ: numbers =", numbers, "и Функция: MoreThan3 (x > 3)")
print("РЕЗ: list(filter(MoreThan3, numbers)) =", numbers_result)

print("-------------------------------------------- Задание 8 (80)")

'''
Создадим чистую и нечистую функцию.
'''


# Чистая
def func_yes(x, y):
    return x + y


print(func_yes(5, 5))

# Не чистая
some_list = []


def func_no(arg):
    some_list.append(arg)
    print(some_list)


func_no(5)

print("-------------------------------------------- Задание 9 (80)")

'''
Сделать функцию поиска минимума и максимума в списке.
'''

print("[Функция поиска минимума и максимума в списке]")
sps = [-1, 5, 4, 3, 7, 8, 4, 6, 5, 9, 0, 0, 3, 1, 2]
print(" Исходный список:", sps)


# 1 Способ
def func5(a):
    # print("до", a)
    a = sorted(a)
    # print("после", a)
    print(" Минимальное число:", a[0], "\n Максимальное число:", a[-1])


# func5(sps)

# 2 Способ
_min = 0
_max = 0
for num in sps:
    if _min > num:
        _min = num
    if _max < num:
        _max = num
print(_min, _max)

print("-------------------------------------------- Задание 10 (80)")

'''
Написать функцию, которая определяет, является ли год високосным. Пользователь вводит год, если он високосный, то функция возвращает True. Если нет, то False.
'''

print("[Функция вовращает True если год високосный]")


# Если год не делится на 4 или делится на 100, но не на 400,
# то он обычный. Во всех остальных случаях - високосный.
def vis_year(year):
    print(" Год:", year)
    # Делится 100 и 400 без остатка - Високосный
    # Делится на 4 с остатком
    if (year % 4 != 0) or ((year % 100 == 0) and (year % 400 != 0)):
        return print(" True")
    else:
        return print(" False")


vis_year(2020)

print("-------------------------------------------- Задание 11 (81)")

'''
Написать функцию season, принимающую 1 аргумент — номер месяца (от 1 до 12), и возвращающую время года, 
которому этот месяц принадлежит (зима, весна, лето или осень).
'''

print("[Функция вовращает пору года по числу месяца]")


def season(num_month):
    print(" Исходный номер месяца:", num_month)
    if 9 <= num_month <= 11:
        print(" Пора года: Осень")
    elif (0 < num_month <= 2) or (num_month == 12):
        print(" Пора года: Зима")
    elif 3 <= num_month <= 5:
        print(" Пора года: Весна")
    elif 6 <= num_month <= 8:
        print(" Пора года: Лето")
    else:
        print(" Некректное число")


season(9)
season(1)
season(4)
season(-4)

print("-------------------------------------------- Задание 12 (81)")

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

print("[Функция возвращает True - дата существует, False - дата не существует]")


def data(day, month, year):
    flag = "False"
    print(" Исходный дата:", day, ".", month, ".", year)
    if (month == 1) or (month == 3) or (month == 5) or (month == 7) or (month == 8) or (month == 10) or (month == 12):
        if 1 <= day <= 31:
            flag = "True"
    elif (month == 4) or (month == 6) or (month == 9) or (month == 11):
        if 1 <= day <= 30:
            flag = "True"
    elif month == 2:
        if 1 <= day <= 28:
            flag = "True"
    else:
        flag = "False"
    print(flag)


data(22, 12, 1996)
data(22, 16, 1996)
data(32, 12, 1996)

print("-------------------------------------------- Задание 13 (82)")

'''
Список [16, -17, 2, 78.7, False, False, {‘True’: True}, 555, 12, 23, 42, ‘DD’] Функция, принимает на вход список
 -выбирает из него все int и float 
 -составить из него новый список, отсортированный от наименьшего значения большему.
'''

print("[Функция сортирует int и float из списка]")


def func13(sps):
    new_sps = []
    for i in sps:
        if type(i) == int or type(i) == float:
            new_sps.append(i)
    return print("", sps, "\n", new_sps, "\n", sorted(new_sps))


lst = [16, -17, 2, 78.7, False, False, {"True": True}, 555, 12, 23, 42, "DD"]
func13(lst)

