# 1. Реализовать скрипт, в котором должна быть предусмотрена
# функция расчета заработной платы сотрудника.
# В расчете необходимо использовать формулу:
# (выработка в часах * ставка в час) + премия.
# Для выполнения расчета для конкретных значений необходимо
# запускать скрипт с параметрами.

# my fale func
def my_func(x, y, c):
    sam = (x * y) + c
    return sam
#Вывожу со свое
from func import my_func

print(my_func(32, 33, 57))


# 2. Представлен список чисел. Необходимо вывести элементы исходного списка,
# значения которых больше предыдущего элемента.Подсказка:
# элементы, удовлетворяющие условию, оформить в виде списка.
# Для формирования списка использовать генератор.

my_list = [3, 45, 43, 24, 68, 84, 9, 5]
num = [i for i in my_list if i > my_list[my_list.index(i) > 1]]
print(num)

# 3. Для чисел в пределах от 20 до 240 найти числа, кратные 20 или 21.
# Необходимо решить задание в одну строку.
# Подсказка: использовать функцию range() и генератор.
num = range(20, 250)

my_list = [i for i in num if i % 20 == 0 or i % 21 == 0 ]
print(my_list)

# 4. Представлен список чисел. Определить элементы списка,
# не имеющие повторений. Сформировать итоговый массив чисел,
# соответствующих требованию. Элементы вывести в порядке их
# следования в исходном списке. Для выполнения задания обязательно
# использовать генератор.

my_list = [5, 6, 12, 9, 5, 9, 33]
my_num = [i for i in my_list if my_list.count(i) < 2]
print(my_num)

# 5. Реализовать формирование списка, используя функцию range()
# и возможности генератора. В список должны войти четные числа
# от 100 до 1000 (включая границы). Необходимо получить результат
# вычисления произведения всех элементов списка.
# Подсказка: использовать функцию reduce().

from functools import reduce

num = range(100, 1000)

my_list = [i for i in num if i % 2 == 0]
my_list2 = [i for i in num if i % 2 == 0]

print(my_list)
print(reduce(my_list2))

# --------------------------------------

def my_func(prev_el, i):
    # prev_el - предыдущий элемент
     # el - текущий элемент
     return prev_el + i
num = range(100, 1000)

print([i for i in num if i % 2 == 0])
print(reduce(my_func, [i for i in num if i % 2 == 0]))


# 6. Реализовать два небольших скрипта:
# а) бесконечный итератор, генерирующий целые числа, начиная с указанного,
# б) бесконечный итератор, повторяющий элементы некоторого списка, определенного заранее.
# Подсказка: использовать функцию count() и cycle() модуля itertools.

# а) бесконечный итератор, генерирующий целые числа, начиная с указанного,

from itertools import count


def my_number(x, y):

    for i in count(x):
         if i > y:
             break
         else:
             print(i)

from func import my_number

print(my_number(10, 100))

# б) бесконечный итератор, повторяющий элементы некоторого списка, определенного заранее.

from itertools import cycle

progr_lang = ["python", "java", "perl", "javascript"]
iter = cycle(progr_lang)
for i in iter:
    print(i)


# 7. Реализовать генератор с помощью функции с ключевым словом
# yield, создающим очередное значение. При вызове функции должен
# создаваться объект-генератор. Функция должна вызываться
# следующим образом: for el in fibo_gen(). Функция отвечает за
# получение факториала числа, а в цикле необходимо выводить
# только первые 15 чисел.
# Подсказка: факториал числа n — произведение чисел от 1 до n.
# Например, факториал четырёх 4! = 1 * 2 * 3 * 4 = 24.

def fibo_gen(n):

    while n != 0:
        yield (n - 1) * n
        n -= 1
     # for i in fibo_gen(n):
     #     yield fibo_gen(n - 1) * n


g = fibo_gen(12)

for el in fibo_gen(15):
     print(el)




def fibo_gen(n):

    while n != 0:
        yield (n - 1) * n
        n -= 1

g = fibo_gen(12)
x = 0
for el in g:
    if x < 15:

        print(el)



# def fibo_gen(n):
#     for el in fibo_gen(10):
#         yield (n - 1) * n
#         n -= 1
#
# g = fibo_gen(4)
# print(g)

