Превратите функцию в функцию генератора без параметров - PullRequest
1 голос
/ 26 февраля 2020

Я новичок в Python, и у меня возникают проблемы, когда я перевожу голову, преобразовывая следующую функцию в функцию генератора, которая не принимает никаких параметров (без импорта itertools). Идея состоит в том, чтобы генерировать бесконечную последовательность взглядов и высказываний, начинающуюся с 2, 12, 1112, 3112 ... и так далее. Как и сейчас, последовательность работает, но я не совсем уверен, где мне нужно изменить свою доходность на доходность или как это сделать без использования параметра (избавление от (n)). Любая помощь будет оценена!

def count_sequence(n):
    if (n == 1):
        return "2"
    if (n == 2):
        return "12"
    x = "12"
    for i in range (3, n + 1):
        x += "$"
        l = len(x)
        count = 1
        temp = ""
        for y in range(1, l):
            if (x[y] != x[y - 1]):
                temp += str(count + 0)
                temp += x[y - 1]
                count = 1
            else:
                count += 1
        x = temp
    return x

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Начните с обёртки вокруг вашей функции:

def my_generator():
    value = 1
    while True:
        result = count_sequence(value)
        yield result
        value += 1

, затем вставьте определение count_sequence, заменив return на yield и n на value. (В этом случае я пропускаю шаг и также напрямую возвращаю возвращаемое значение, вместо того, чтобы присвоить его сначала result, а затем один раз yield result в нижней части while l oop.)

def my_generator():
    value = 1
    while True:
        if value == 1:
            yield "2"
        elif value == 2:
            yield "12"
        else:
            x = "12"
            for i in range(3, value+1):
                x += "$"
                l = len(x)
                count = 1
                temp = ""
                for y in range(1, l):
                    if x[y] != x[y-1]:
                        temp += str(count)
                        temp += x[y-1]
                        count = 1
                    else:
                        count += 1
                x = temp
             yield x
         value += 1

Затем вы можете немного упростить его, например, вытащив первые два оператора выражения yield из l oop и избавившись от оператора if.

def my_generator():
    yield "2"
    yield "12"
    value = 3
    while True:
        x = "12"
        for i in range(3, value+1):
            x += "$"
            l = len(x)
            count = 1
            temp = ""
            for y in range(1, l):
                if x[y] != x[y-1]:
                    temp += str(count)
                    temp += x[y-1]
                    count = 1
                else:
                    count += 1
            x = temp
         yield x
         value += 1
0 голосов
/ 26 февраля 2020

Я предполагаю, что ваш метод count_sequence () вызывается так:

count_sequence(1)
count_sequence(2)
count_sequence(3)
...

В качестве генератора функция будет выглядеть следующим образом:

def count_sequence():
  yield "2"
  yield "12"
  x = "12"
  n = 2
  while True:
    n += 1
    for i in range (3, n + 1):
      x += "$"
      l = len(x)
      count = 1
      temp = ""
      for y in range(1, l):
        if (x[y] != x[y - 1]):
          temp += str(count + 0)
          temp += x[y - 1]
          count = 1
        else:
          count += 1
      x = temp
    yield x

n теперь является переменной отслеживается в функции генератора.

Вызовите генератор с:

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