'''
2 Представлен список чисел. Необходимо вывести элементы исходного списка, значения которых больше предыдущего элемента.
Подсказка: элементы, удовлетворяющие условию, оформить в виде списка. Для его формирования используйте генератор.
Пример исходного списка: [300, 2, 12, 44, 1, 1, 4, 10, 7, 1, 78, 123, 55].
Результат: [12, 44, 4, 10, 78, 123].
'''

l = [300, 2, 12, 44, 1, 1, 4, 10, 7, 1, 78, 123, 55]
print([x for n, x in enumerate(l) if x > l[n-1] and n != 0])

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

print([x for x in range(20, 241) if x%20==0 or x%21==0])

'''
4 Представлен список чисел. Определите элементы списка, не имеющие повторений. Сформируйте итоговый массив чисел,
соответствующих требованию. Элементы выведите в порядке их следования в исходном списке.
Для выполнения задания обязательно используйте генератор.
Пример исходного списка: [2, 2, 2, 7, 23, 1, 44, 44, 3, 2, 10, 7, 4, 11].
Результат: [23, 1, 3, 10, 4, 11]
'''

l =[2, 2, 2, 7, 23, 1, 44, 44, 3, 2, 10, 7, 4, 11]
print([x for x in l if l.count(x) == 1])

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

from functools import reduce
def my_func(prev_el, el):
    return prev_el + el

l = [x for x in range(100, 1001) if x % 2 == 0]
print(reduce(my_func, l))

'''
6 Реализовать два небольших скрипта:
итератор, генерирующий целые числа, начиная с указанного;
итератор, повторяющий элементы некоторого списка, определённого заранее.
Подсказка: используйте функцию count() и cycle() модуля itertools.
Обратите внимание, что создаваемый цикл не должен быть бесконечным. Предусмотрите условие его завершения.
Например, в первом задании выводим целые числа, начиная с 3. При достижении числа 10 — завершаем цикл.
Вторым пунктом необходимо предусмотреть условие, при котором повторение элементов списка прекратится.
'''

from itertools import count, cycle
a = int(input('Введите стартовое число: '))
b = int(input('Введите число для завершения цикла: '))

for x in count(start=a):
    print(x)
    if x == b:
        break


a = input('Введите несколько чисел: ')
b = int(input('Введите число для завершения цикла: '))

for n, x in enumerate(cycle(a)):
    print(x)
    if n == b:
        break

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

def fact(n):
    res = 1
    for i in range(1, n+1):
        res *= i
        yield res

for el in fact(10):
    print(el)