Функция выдает различный вывод после покрытия его функцией генератора - PullRequest
0 голосов
/ 13 октября 2019

Я создал следующий алгоритм для создания функции для генерации Baum-Sweet-Sequence .

def baum_sweettest(number_as_byte):
    counter = 0
    for bit in str(number_as_byte):
      print("bit = ", bit)
      if bit == "0":
        counter += 1 
      if bit == "1":
        if counter%2 !=0 or counter == 1:
          counter = 0
          return 0
    print("counter = ", counter)
    if counter%2 !=0 or counter == 1:
      counter = 0
      return 0
    else:
      return 1

print(baum_sweettest(110))

Я довольно новичок в Python, поэтому я знаю, что этоВероятно, это далеко не лучший способ ее решения. Любые отзывы по этому поводу приветствуются, однако меня в первую очередь интересует, почему эта функция создает разные результаты при преобразовании в следующую функцию генератора:

def baum_sweet():
    yield 1
    counter = 0
    for n in range(1,1000):
        number_as_binary = bin(n)[2::]
        for bit in str(number_as_binary):
            if bit == "0": 
                counter += 1 
            if bit == "1":
                if counter%2 !=0 or counter == 1:
                    counter = 0
                    yield 0
        if counter%2 !=0 or counter == 1:
            counter = 0
            yield 0
        else:
            counter = 0
            yield 1

baum_sweettest() возвращает 0 при проверке на число 6 (110), что является правильным.

Объект-генератор, созданный baum_sweet, доставляет / выдает правильные результаты вплоть до числа 6, где он дает 1.

Поскольку алгоритм такой же вЯ полагаю, что в обоих случаях это связано с разным поведением в функциях генератора. Читая документацию, я обнаружил, что они не прекращаются, а просто продолжаются до следующего предложения доходности. Поэтому я убедился, что мой счетчик будет сброшен вручную перед каждым выходом. Однако генераторная версия моего алгоритма в какой-то момент все еще дает разные результаты, как и тот же алгоритм в «не генераторной функции».

Может кто-нибудь объяснить, почему эти две функции возвращают / дают разные результаты?

1 Ответ

0 голосов
/ 13 октября 2019

Я не уверен, что понимаю ваш вопрос, но вот как я могу преобразовать функцию в генератор - в основном, просто заменив return s на yield statemtnts:

def baum_sweettest(number_as_byte):
    counter = 0
    for bit in str(number_as_byte):
      print("bit = ", bit)
      if bit == "0":
        counter += 1
      if bit == "1":
        if counter%2 !=0 or counter == 1:
          counter = 0
          return 0
    print("counter = ", counter)
    if counter%2 !=0 or counter == 1:
      counter = 0
      return 0
    else:
      return 1

print(baum_sweettest(110))

# Generator version.
def baum_sweet(number_as_byte):
    counter = 0
    for bit in str(number_as_byte):
      print("bit = ", bit)
      if bit == "0":
        counter += 1
      if bit == "1":
        if counter%2 !=0 or counter == 1:
          counter = 0
          yield 0
    print("counter = ", counter)
    if counter%2 !=0 or counter == 1:
      counter = 0
      yield 0
    else:
      yield 1

print()
for counter in baum_sweet(110):
    pass
print(counter)

Вывод:

bit =  1
bit =  1
bit =  0
counter =  1
0

bit =  1
bit =  1
bit =  0
counter =  1
0
...