Как найти факториал каждого третьего простого числа в заданном диапазоне?

Дан диапазон целых чисел от n1 до n2. Найти факториал каждого третьего простого числа в заданном диапазоне. Можно было ли сделать код проще или пойдет ?

def find_simple(n):
    s = True
    for i in range(2, n):
        if n%i == 0:
            s = False
            break
    return s

def factorial(n):
    s = 1
    for i in range(1, n+1):
        s *= i
    return s

l = range(30, 70)
k = 0
for i in l:
    if find_simple(i) == True:
        k += 1
        if k == 3:
            k = 0
            print('Число: ', i ,'\nФакториал числа',factorial(i))

Ответы (1 шт):

Автор решения: CrazyElf

Можно написать несколько короче и немного оптимальнее. Хотя короче не всегда значит быстрее, не всегда значит понятнее, любое решение это компромисс:

from functools import reduce

def is_simple(n):
    return all(n % i for i in range(2, int(n**0.5)+1))

def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n))

for i in list(filter(is_simple, range(30, 70)))[2::3]:
    print(f'Число: {i}\nФакториал числа: {factorial(i)}')

Пояснения:

  • функция проверки на простоту должна называться is_simple (вернее даже is_prime, но не суть), потому что функция проверяет число, а не ищет
  • проверять на простоту достаточно перебирая делители до корня из числа
  • можно записать всю проверку коротко в одну строку и во вполне в "человеческом" виде: "все остатки от деления не нулевые, вплоть до корня из числа"
  • факториал можно записать через reduce, понятнее ли это - вопрос на самом деле спорный, но это опять же однострочник
  • перебор "каждого третьего простого числа в диапазоне" также можно записать однострочником
  • печатать значения лучше современным способом, через f-строки
→ Ссылка