Как найти факториал каждого третьего простого числа в заданном диапазоне?
Дан диапазон целых чисел от 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-строки