Доступ к локальным переменным метода в Python - PullRequest
0 голосов
/ 25 января 2011

Проходил обучение по 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 в моем предыдущем примере?Если да, то как? (Наверное, нет).Если нет, то переписанный код достаточно хорош или я делаю это неправильно?

Ответы [ 3 ]

3 голосов
/ 25 января 2011

Вам нужно:

print eg.isprime(num)[2]

(ваш метод возвращает кортеж, и вам нужен третий член, вот и все)

3 голосов
/ 25 января 2011

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

import math, time
class PrimeFactor:
    def __init__(self):
        self.fnum = [1,]
        self.elapsedTime = 0
    def getElapsedTime(self):
        return self.elapsedTime
    def getFactors(self):
        return self.fnum
    def isprime(self,number):
        start=time.clock()
        self.fnum = [1,]
        last = int(math.ceil(math.sqrt(number)))
        for p in range(2, last + 1):
            if (number % p) == 0:
                self.fnum.append(p)
                self.fnum.append(number / p)
        # Remove duplicates, sort list
        self.fnum = list(set(self.fnum))
        self.fnum.sort()
        end=time.clock()
        self.elapsedTime = end-start
        return (not len(self.fnum) > 1 )

num =int(raw_input("Enter number: "))
eg=PrimeFactor()

if eg.isprime(num):
    print num, "is a Prime Number", eg.isprime(num)
else:
    print num, "is not a prime number"
    print "Factors", eg.getFactors()
print eg.getElapsedTime()

Вы можете даже разработать код немного больше и использовать преимущества предыдущих вычисленных факторов, используядинамическое программирование.

Надеюсь, это поможет.

2 голосов
/ 25 января 2011

Нет способа получить доступ к локальным переменным функции вне этой функции.Вам необходимо явно сделать их доступными для вызывающих, либо вернув их, либо записав их значения в контейнер, доступный для вызывающей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...