Как убрать повторяющиеся код?

Есть код который находит все просты числа от 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
  1. Как вариант, использовать цикл 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
  1. Генератор, если вдруг понадобиться:
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
  1. Однако вывод вашей функции не совсем соответсвует описанию:
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] 
...
  1. Этот код уберет первые 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
→ Ссылка