В Генераторе, зачем нам нужен этот дополнительный шаг в этой программе ?. Не могли бы вы объяснить это подробно?

    class PrimeGenerator:

       def __init__(self, stop):
       self.stop = stop
       self.start=2
       self.number=0


       def __next__(self):
           for self.number in range(self.start,self.stop):
                for x in range(2, self.number):
                      if self.number % x == 0:
                      break
                else:
                   self.start=self.number+1
                   return self.number
             raise StopIteration                   


  obj = PrimeGenerator(5)
  print(next(obj))

В приведенном выше коде мы увеличиваем значение self.start здесь. Это self.start = self.number + 1. Я сомневаюсь, что он может автоматически перебирать цикл for. Еще почему и здесь увеличилось?

-1
Madhumathi 30 Окт 2019 в 00:17

1 ответ

Лучший ответ

Генератор должен генерировать простые числа. Он начинается со значения 2 как self.number, а затем проверяет, делит ли какое-либо число от 2 до self.number self.number, если это так, это не простое число (поскольку простые числа можно делить только на 1 или на себя) .

После того, как он нашел простое число (что означает, что он не перешел к оператору break, так как никакое число не делило его), вам нужно увеличить self.start, чтобы начать одно число после простого числа, которое вы нашли прямо сейчас. Затем вы возвращаете прайм.

Если вы не увеличиваете значение self.start, вы всегда будете проверять первое простое число.

Дополнительно: ваш тест проверяет только простые числа больше 2, поскольку 2% 2 равно нулю.

И для будущих публикаций (особенно для кода Python) убедитесь, что вкладки сделаны правильно. Ваш код должен выглядеть так:

class PrimeGenerator:

  def __init__(self, stop):
    self.stop = stop
    self.start=2
    self.number=0

  def __next__(self):
    for self.number in range(self.start,self.stop):
      for x in range(2, self.number):
        if self.number % x == 0:
          break
        else:
          self.start=self.number+1
          return self.number                 


obj = PrimeGenerator(7)
print(next(obj))
0
Spanching 29 Окт 2019 в 21:42