【问题标题】:Function produces different output after coverting it to a generator function函数将其转换为生成器函数后产生不同的输出
【发布时间】:2020-02-10 01:26:30
【问题描述】:

我创建了以下算法来创建生成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() 在测试正确的数字 6 (110) 时返回 0。

baum_sweet 创建的生成器对象提供/产生正确的结果,直到数字 6,它产生 1。

由于两种情况下的算法是相同的,我猜这是由于生成器函数的行为不同。阅读我发现的文档,这些文档并没有终止,而是一直持续到下一个 yield 语句。所以我确保在每次产量之前手动重置我的计数器。然而,我的算法的生成器版本在某些时候仍然会产生不同的结果,就像“非生成器函数”中的相同算法一样。

谁能详细说明为什么这两个函数返回/产生不同的结果?

【问题讨论】:

  • 你能修复你的第二个代码缩进吗?
  • yield 不会退出函数。您的生成器函数可以为 n 的一个值发出多个值。
  • 正如@khelwood 所说,yield 不会退出生成器,它会产生新值。您可以通过调用return 显式地从生成器返回。如果没有 yield 调用,则它不是生成器。

标签: python generator yield-return


【解决方案1】:

我不确定我是否理解你的问题,但我将如何将函数转换为生成器 - 基本上只需将 returns 替换为 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

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 2021-01-03
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2019-11-29
    相关资源
    最近更新 更多