# 1. Реализовать функцию, принимающую два числа (позиционные аргументы) и выполняющую их деление.
# Числа запрашивать у пользователя, предусмотреть обработку ситуации деления на ноль.

def razdelit(x, y):
    """

    Фунция принимает два числа , делимое и делитель.
    Возвращает результат деления.

    """
    result = x / y
    return result


y = 0
x = int(input('Введите делимое : '))
while y == 0:
    y = int(input('Введите делитель, (делитель не должен равняться 0) : '))

print(x, ' / ', y, '=', razdelit(x, y))

# 2. Реализовать функцию, принимающую несколько параметров,
# описывающих данные пользователя: имя, фамилия, год рождения, город проживания, email, телефон.
# Функция должна принимать параметры как именованные аргументы.
# Реализовать вывод данных о пользователе одной строкой.

# Не работает, словарь создал , а вывести не могу.
def user_info(**kwargs):
    print(kwargs)  # создаваемый словарь
    my_str = ('Имя -' + kwargs.get(my_name) +
              ' Фамилия -' + kwargs.get(my_family) +
              ' Год рождения -' + kwargs.get(my_god) +
              ' Город проживания -' + kwargs.get(my_citi) +
              ' Электронная почта -' + kwargs.get(my_email) +
              ' Номер телефона -' + kwargs.get(my_telefon))
    return my_str


new_str = user_info(my_name="Виктор", my_family="Рябцев", my_god="1979",
                    my_citi="Владивосток", my_email="89089938799mail.ru", my_telefon="89089938799")
print(new_str)

# 3. Реализовать функцию my_func()
# которая принимает три позиционных аргумента, и возвращает сумму наибольших двух аргументов.

def add_func(x, y, z):
    """

    Эта функция принимает три аргумента и возвращяет сумму двух наибольших из них

    """
    list = [x, y, z]  # Преобразуем полученные аргументы в список
    list.sort()  # Сортируем список от  мин. к макс.
    index = (len(list) - 1)  # Получаем положение последнего (максимального) значения в списке
    summa_1 = list[index] + list[index - 1]  # Суммируем последнее (максимальное) и предпоследнее (второе по величине)
    return summa_1


print(add_func(2, 4, 56))


# 3. Эта функция обрабатывает неограниченное количество аргументов и возвращяет сумму двух наибольших из них

def add_func1(*x):
    """

    Эта функция принимает неограниченное количество аргументов и возвращяет сумму двух наибольших из них

    """
    my_list = list(x)  # Преобразуем полученные аргументы в список
    my_list.sort()  # Сортируем список от  мин. к макс.
    index = (len(my_list) - 1)  # Получаем положение последнего (максимального) значения в списке
    summa = my_list[index] + \
            my_list[index - 1]  # Суммируем последнее (максимальное) и предпоследнее (второе по величине)
    return summa


print(add_func1(2, 4, 56, 7, 5, 0, -1, 12))


# 4. Программа принимает действительное положительное число x и целое отрицательное число y.
# Необходимо выполнить возведение числа x в степень y.
# Задание необходимо реализовать в виде функции my_func(x, y).
# При решении задания необходимо обойтись без встроенной функции возведения числа в степень.

# Подсказка: попробуйте решить задачу двумя способами. Первый — возведение в степень с помощью оператора **.
# Второй — более сложная реализация без оператора **, предусматривающая использование цикла.

# Первый — возведение в степень с помощью оператора **

def my_func3(x, y):
    """
       Данная функция принимает аргуенты позиционные оргументы x и y,
       возводит x  в cтепень  y,
       возвращает z
       """
    z = x ** y
    return z


print(my_func3(2, -2))

# Второй — более сложная реализация без оператора **, предусматривающая использование цикла.

n = int(input('Число которое вы хотите возвести в степень: '))
p = int(input('Степень в которую вы хотите возвести число: '))
s = p  # переменная s только для последующего отображения значения степени при печати.


def my_func4(n, p):
    """
    Данная функция принимает аргуенты позиционные оргументы x и y,
    возводит x  в cтепень  y,
    возвращает result
    """
    result = 1
    while (p > 0):
        result = result * n
        p = p - 1
    return result


res = my_func4(n, p)
print((f'{n}, в степени {s} равно {res}'))


# 5. Программа запрашивает у пользователя строку чисел, разделенных пробелом.
# При нажатии Enter должна выводиться сумма чисел.
# Пользователь может продолжить ввод чисел, разделенных пробелом и снова нажать Enter.
# Сумма вновь введенных чисел будет добавляться к уже подсчитанной сумме.
# Но если вместо числа вводится специальный символ, выполнение программы завершается.
# Если специальный символ введен после нескольких чисел,
# то вначале нужно добавить сумму этих чисел к полученной ранее сумме и после этого завершить программу.
def add_func(new_list):
    """
    Эта функция принимает как аргумент список состоящий из чисел, и печатает их сумму.

    """
    my_sum = sum(new_list)
    print('Сумма введеных вами чисел равна : ', str(my_sum))


def my_input():
    """
    Эта функция не имеет аргументов, возвращает строку получаемую через input

    """
    return input('Введите строку из нескольких чисел разделенных пробелами,'
                 ' я суммирую эти числа (если введете #, работа программы прекратится: ')


new_list = []
my_str = ''

while my_str != '#':
    my_str = my_input()
    for number in my_str.split():
        if number != '#':
            new_list.append(int(number))
        elif number == '#':
            add_func(new_list)
            quit()
    add_func(new_list)


# 6. Реализовать функцию int_func(),
# принимающую слово из маленьких латинских букв и возвращающую его же, но с прописной первой буквой.
# Например, print(int_func(‘text’)) -> Text.


def int_func(my_str):
    """
    Данная функция принимает в качестве аргумента строку.
    Возвращает строку изменив первую ее букву на прописную.

    """
    text = ''
    text = my_str.title()
    return text


print(int_func('tEXT'))

# Продолжить работу над заданием.
# В программу должна попадать строка из слов, разделенных пробелом.
# Каждое слово состоит из латинских букв в нижнем регистре.
# Сделать вывод исходной строки, но каждое слово должно начинаться с заглавной буквы.
# Необходимо использовать написанную ранее функцию int_func().

new_list = []
new_str = ''
for word in input('Введите строку из нескольких слов разделенных пробелами,'
                  ' я заменю первые буквы прописными: ').split():  # Принимаем строку и разделяем ее на отдельные слова.
    new_list.append(word)  # Формируем список слов.

for word in new_list:  # Перебираем все слова в списке.
    new_str += int_func(word) + ' '  # формируем новую строку разделяя отдельные слова пробелами.
print('Новая строка : ', new_str)  # Распечатываем новую строку.
