2013-05-18 3 views
2

Я как бы новичок в программировании. Я пытаюсь написать алгоритм в Python, что дает все простые множители числа:Очистить список в функции каждый раз, когда он запущен

factors=[] 
def factor(n): 
    for i in range(2,n+1): 
     if n%i==0: 
      factors.append(i) 
      factor(int(n/i)) 
      break 
    return factors 

Это работает, но всякий раз, когда я снова запустить функцию «фактор», он просто добавляет к уже заселенным «факторам 'list - как я могу получить список для очистки каждый раз, когда запускается функция «factor»?

+0

too bad Отмечено, что ответили на ссылку «Очистить списки Python» выше. Некоторые из них маркируют дубликаты на основе названия без чтения вопросов. Это явно другой вопрос ... IMHO –

ответ

6

Объявите локальную переменную внутри функции. В вашем коде вы фактически изменяете глобальную переменную factors каждый раз, когда вы вызываете factor().

def factor(n, factors=None): 
    factors = [] if factors is None else factors 
    for i in range(2, n + 1): 
     if n%i==0 and i not in factors: #checks for duplicates as well 
      factors.append(i) 
      factor(int(n/i),factors) #pass the factors list in the recurive call 
      break 
    return factors 

factor(20) #returns [2, 5] 
+0

Спасибо - я пошел, это был мой окончательный результат: def factor (n, factor = None): Факторы = [], если факторы не являются другими факторами для i в диапазоне (2 , п + 1): если п% я == 0: factors.append (я) фактор (интермедиат (п/я), факторы) перерыв возвращение факторы , как я хочу, чтобы все простые множители, включая дубликаты - но спасибо за вашу помощь! – user2396812

0

@ ashwini-chaudhary имеет отличный ответ, и это самый распространенный идиом, который я использую для этого. ОП задавал обобщенный вопрос, поэтому я предлагаю исправленное решение, которое использует закрытие python, чтобы сделать то же самое.

Это две строки длиннее (одна для объявления внутренней функции и одна для ее вызова) и может быть «уродливой» для кого-то, но она имеет то преимущество, что не добавляет сургументы в оргинальную функцию, которую вызывающий не должен видеть или использовать и не называть условное присвоение при каждой рекурсии.

def factor2(n): 
    factors = [] 
    def fact(n): 
     for i in range(2, n + 1): 
      if n%i==0 and i not in factors: #checks for duplicates as well 
       factors.append(i) 
       factor(int(n/i),factors) #pass the factors list in the recurive call 
       break 
    fact(n) 
    return factors 
Смежные вопросы