Я думаю, что стоило бы измерить производительность решения, которое делает модуль только по первым sqrt(n)
числам.
def factors(n):
sqrt = int(n ** .5)
half_factors = [i for i in range(1, sqrt + 1) if n % i == 0]
return half_factors + [n // i for i in half_factors[n%sqrt == 0::-1]]
Быстрый тест:
>>> factors(16)
[1, 2, 4, 8, 16]
>>> factors(20)
[1, 2, 4, 10, 20]
Примечание: Измените range
на xrange
, если вы находитесь в Python 2, но сохраните //
, который явно вызывает деление на этаж.