Как убрать повторяющиеся код?
Есть код который находит все просты числа от 2 до n. Он работает нормально но мне не нравится что в нем есть почти два одинаковых if. Как их убрать и при этом не увеличить время работы функции?
def f(n):
set_ = set()
arr = [2, 3]
for i in range(6, n+1, 6):
a, b = i - 1, i + 1
if a not in set_:
set_.update(range(a, n+1, a))
arr.append(a)
if b not in set_:
set_.update(range(b, n+1, b))
arr.append(b)
return arr
Ответы (2 шт):
Автор решения: CrazyElf
→ Ссылка
Ну вынести в функцию общие действия - стандартный же рефакторинг:
def f_update(arr, set_, x, n):
if x not in set_:
set_.update(range(x, n+1, x))
arr.append(x)
def f(n):
set_ = set()
arr = [2, 3]
for i in range(6, n+1, 6):
a, b = i - 1, i + 1
f_update(arr, set_, a, n)
f_update(arr, set_, b, n)
return arr
Автор решения: n1tr0xs
→ Ссылка
- Как вариант, использовать цикл
for:
def f(n):
set_ = set()
arr = [2, 3]
for i in range(6, n+1, 6):
for var in (i-1, i+1):
if var not in set_:
set_.update(range(var, n+1, var))
arr.append(var)
return arr
- Генератор, если вдруг понадобиться:
def gen_f(n):
yield 2
yield 3
set_ = set()
for i in range(6, n+1, 6):
for var in (i-1, i+1):
if var not in set_:
set_.update(range(var, n+1, var))
yield var
return None
- Однако вывод вашей функции не совсем соответсвует описанию:
n, f(n)
0 [2, 3] # 2 > 0 and 3 > 0
1 [2, 3] # 2 > 1 and 3 > 1
2 [2, 3] # 2 == 2 and 3 > 2
3 [2, 3] # 3 == 3
4 [2, 3]
5 [2, 3]
6 [2, 3, 5, 7] # 7 > 6
7 [2, 3, 5, 7] # 7 == 7
8 [2, 3, 5, 7]
9 [2, 3, 5, 7]
...
- Этот код уберет первые 2 ошибочных вывода:
def f1(n):
arr = []
for m in (2, 3):
if n < m:
return arr
arr.append(m)
set_ = set()
for i in range(6, n+1, 6):
for var in (i-1, i+1):
if var not in set_:
set_.update(range(var, n+1, var))
arr.append(var)
return arr