Проходил обучение по Python и задал здесь вопрос (Код из моего предыдущего примера и спасибо @emmanuel)
Код:
import math, time
class PrimeFactor:
def __init__(self):
pass
def isprime(self,number):
start=time.clock()
fnum = [1,]
print "Reticulating Splines..."
last = int(math.ceil(math.sqrt(number)))
for p in range(2, last + 1):
if (number % p) == 0:
fnum.append(p)
fnum.append(number / p)
# Remove duplicates, sort list
fnum = list(set(fnum))
fnum.sort()
end=time.clock()
if len(fnum) > 1:
return number, "is not a prime because of these factors", fnum ,"Time taken", end-start
else:
return True, "Time taken", end-start
print "Prime or factor calculator v3 using sqrt(n)"
print #
num =int(raw_input("Enter number: "))
eg=PrimeFactor()
print eg.isprime(num)
Из этого кода я попытался получить переменную fnum, локальную для функции (метода) isprime, которая содержит список факторов.Доступ к нему с помощью вызова
print eg.isprime(num).fnum
дал мне ошибку
AttributeError: 'tuple' object has no attribute 'fnum'
Я думаю, я не могу вызвать локальную переменную таким образом.
Плюс код не подлежит повторному использованию.Поэтому я решил сделать переписывание, чтобы сделать его более модульным.
Переписанный код:
import math
class PrimeFactor:
def __init__(self):
pass
def isPrime(self,number):
fnum = [1,]
last = int(math.ceil(math.sqrt(number)))
for p in range(2, last + 1):
if (number % p) == 0:
return False
else:
return True
def getFactors(self,number):
fnum = [1,]
last = int(math.ceil(math.sqrt(number)))
for p in range(2, last + 1):
if (number % p) == 0:
fnum.append(p)
fnum.append(number / p)
# Remove duplicates, sort list
fnum = list(set(fnum))
fnum.sort()
if len(fnum) > 1:
return fnum
else:
return None
num =int(raw_input("Enter number: "))
eg=PrimeFactor()
if eg.isPrime(num):
print num, "is a Prime Number"
else:
print num, "is not a prime number"
print "Factors", eg.getFactors(num)
Мне пришлось отказаться от расчета времени.Я могу рассчитать время при использовании экземпляра.
Вопрос:
Можно ли получить доступ к локальной переменной fnum
в моем предыдущем примере?Если да, то как? (Наверное, нет).Если нет, то переписанный код достаточно хорош или я делаю это неправильно?