#python #methods
Вопрос:
У меня есть two methods within the same class
, и я хочу сделать list
один метод доступным в другом методе, как мне это сделать?
Вот мой код:
class Solution:
primes=[]
def primeNumber(self,n):
numbers = set(range(n, 1, -1))
self.primes = []
while numbers:
p = numbers.pop()
self.primes.append(p)
numbers.difference_update(set(range(p * 2, n 1, p)))
def goodNumbers(self,f):
self.primes.append(f)
return self.primes
x=Solution()
print(x.primeNumber(100)) ##populate the list
print(x.goodNumbers(123456789)) ##return the list as populated by previous call, and with the long number appended
По какой — то причине self.primes не учитывает длинное число, добавленное в goodNumbers () — есть идеи, почему это так?
Комментарии:
1. одним из быстрых способов было бы
self.primes = []
сделать всеprimes
, чтобыself.primes
2. Любой учебник по Python расскажет об этом в разделе, посвященном классам.
Ответ №1:
Как уже было сказано, вы можете использовать переменную экземпляра self.primes
вместо локальной переменной primes
. Это полезно, если вы планируете повторно использовать значения.
Если вместо этого вы просто хотите использовать значения один раз и хотите goodNumbers
позвонить primeNumber
, то просто добавьте return primes
в конце primeNumber
(вне while
цикла, конечно)
Редактировать
Поскольку вопрос был изменен:
Я только что видел ваш отредактированный вопрос. Это не сработает: если вы используете self.primes
для передачи данных между методами, вам нужно сначала создать их, вероятно , во время инициализации объекта, затем заполнить их вызовом primeNumber
, а затем вы можете прочитать/изменить их goodNumbers
.
Например:
class Solution:
primes=[]
def primeNumber(self,n):
numbers = set(range(n, 1, -1))
self.primes = []
while numbers:
p = numbers.pop()
self.primes.append(p)
numbers.difference_update(set(range(p * 2, n 1, p)))
def goodNumbers(self,n):
self.primes.append(7598347534)
return self.primes
x=Solution
x.primeNumber(100) ##populate the list
x.goodNumbers(123456789) ##return the list as populated by previous call, and with the long number appended
Комментарии:
1. Спасибо gimix — один вопрос, если я определю self.простые числа, скажем, в первом методе, должен ли я вернуть его, чтобы вызвать его в другом методе? В противном случае, как я могу использовать self.primes в другом методе?
2.
self.primes
является атрибутом объекта и напрямую доступен каждому методу (а также за пределами объекта: если вызывается ваш экземплярSolution
x
, тоx.primes
он предоставляет вам список). Поэтому, как толькоprimeNumber
вы напишетеself.primes
, вы просто получите доступ к немуgoodNumbers
или любым другим методам, какself.primes
3. Спасибо, Джимикс, в последний раз, пожалуйста, — я отредактировал вопрос. Почему x.primeNumber(100) не возвращает None? Но x.goodNumbers(123456789) работает просто отлично, он печатает список простых чисел до 100, а затем добавляет 123456789.
4. Извините, я пропустил скобки, все
x=Solution()
так, как вы сказали. Он ничего не печатает, потому что у вас больше нетprint()
вызова — он возвращает список: попробуйтеy = x.goodNumbers(123456789)
или простоprint(x.goodNumbers(123456789))
5. Привет, Гимикс, извините за последний вопрос, действительно ли нам нужны простые числа = [] внутри класса? Потому что, когда я опускаю это, все по-прежнему работает, и для меня не имеет смысла, почему это происходит, потому что кажется, что мы просто переопределяем это в наших методах?
Ответ №2:
вы можете добавить список в качестве переменной, в которую вы можете передавать данные: например
def goodNumbers(self,n,primes = [] ):
newprime = ( get the next prime number )
if not newprime in primes:
primes.append( newprime )
return primes
primes = [2, 3, 5, 7, 11, 13, 17, 19]
goodnumbers( n, primes )