2016-10-11 1 views
0

Я пишу код, который должен найти простую факторизацию чисел. Основная функция увеличивается через числа; Я делаю это, потому что я хочу использовать код для проведения временных экспериментов. Я не возражаю, что это не суперэффективно, часть проекта для меня будет более эффективной. Он еще не полностью завершен.Переменная, на которую ссылается перед ошибкой присваивания в простой программе факторизации?

import math 
import time 

primfac=[] 

def primcheck(n): 
    for x in xrange(2, int(n**0.5)+1): 
     if n % x == 0: 
      return False 
    return True 

def primes(n): 
    sieve = [True] * n 
    for i in xrange(3,int(n**0.5)+1,2): 
     if sieve[i]: 
      sieve[i*i::2*i]=[False]*((n-i*i-1)/(2*i)+1) 
    return [2] + [i for i in xrange(3,n,2) if sieve[i]] 


def factfind(lsp,n): #finds factors of n among primes 
    for i in lsp: 
     if n%i==0: 
      primfac.append(i) 
     else: 
      i+=1 

def simplify(lsp, n): 
    x = 1 
    for i in lsp: 
     x=i*x 
    if x != n: 
     print "needs exponent, computing" 
     for i in lsp: 
      y=n/i 
      if primcheck(y) == True: 
       lsp.append(y) 
      else: 
       lsp.append(factfind(primes,y)) 

def primfacfind(n1,n2): 
    while n1 <= n2: 
     time_start = time.clock() 
     if primcheck(n1) == True: 
      print "prime" 
      time_elapsed = time.clock() - time_start 
      print "time:", time_elapsed 
      n1+=1 
     else: 
      n = n1 
      print "starting #", n 

      factfind(primes(n),n) 
      print primfac 

      del primfac 
      primfac[:] = [] 
      simplify(primfac, n) 

      time_elapsed = time.clock() - time_start 
      print "time:", time_elapsed 

      n1+=1 

primfacfind(6,15) 

Когда я запускаю код, он дает следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "python", line 65, in <module> 
    File "python", line 54, in primfacfind 
UnboundLocalError: local variable 'primfac' referenced before assignment 

Что я не понимаю, потому что я проверил все функции, кроме функции simplify и даже тогда только новая часть это линии после print.

+1

Проблема заключается в вашей строке 'del primfac' в' primefacfind'. Это позволяет компилятору присваивать переменную '' primefac' 'как локальную переменную, но поскольку локальная переменная 'primefac' не создана, вы получаете * ошибку времени выполнения *' UnboundLocalError: локальная переменная' primfac ', на которую ссылаются перед присваиванием ' –

+0

Так вот почему 'print primfac' в блоке' else' в 'primefacfind' бросает ошибку. –

+0

Так, например, я думаю, что вместо того, чтобы 'del primefac', вместо того, чтобы' del primefac', вместо этого следует использовать 'primefac.clear()', потому что последнее заставит компилятор обрабатывать 'primefac' как локальную переменную. –

ответ

1

Функции в python могут обращаться только к переменным, объявленным за пределами области действия, только для чтения, без ключевого слова global.

import math 
import time 

primfac=[] 

def primcheck(n): 
    for x in xrange(2, int(n**0.5)+1): 
     if n % x == 0: 
      return False 
    return True 

def primes(n): 
    sieve = [True] * n 
    for i in xrange(3,int(n**0.5)+1,2): 
     if sieve[i]: 
      sieve[i*i::2*i]=[False]*((n-i*i-1)/(2*i)+1) 
    return [2] + [i for i in xrange(3,n,2) if sieve[i]] 


def factfind(lsp,n): #finds factors of n among primes 
    for i in lsp: 
     if n%i==0: 
      primfac.append(i) 
     else: 
      i+=1 

def simplify(lsp, n): 
    x = 1 
    for i in lsp: 
     x=i*x 
    if x != n: 
     print "needs exponent, computing" 
     for i in lsp: 
      y=n/i 
      if primcheck(y) == True: 
       lsp.append(y) 
      else: 
       lsp.append(factfind(primes,y)) 

def primfacfind(n1,n2): 
    global primfac 
    while n1 <= n2: 
     time_start = time.clock() 
     if primcheck(n1) == True: 
      print "prime" 
      time_elapsed = time.clock() - time_start 
      print "time:", time_elapsed 
      n1+=1 
     else: 
      n = n1 
      print "starting #", n 

      factfind(primes(n),n) 
      print primfac 

      del primfac 
      primfac = [] 
      simplify(primfac, n) 

      time_elapsed = time.clock() - time_start 
      print "time:", time_elapsed 

      n1+=1 

primfacfind(6,15) 
+0

Python может ссылаться на переменные за пределами функции просто отлично. –

+0

... но вам нужно глобальное ключевое слово. Код, который я опубликовал, когда ключевое слово «global» добавлено в функцию, позволяет избежать ошибки, которую имел OP. – Scott

+0

... в отличие от большинства других языков, которые допускают такие вещи без какого-либо специального лечения. https://en.wikipedia.org/wiki/Global_variable – Scott

Смежные вопросы