函数将其转换为生成器函数后产生不同的输出

2024-09-25 08:41:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了以下算法来创建生成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创建的generator对象提供/产生正确的结果,最多为数字6,其中它产生1

由于两种情况下的算法是相同的,我猜这是由于生成器函数中的不同行为造成的。通过阅读文档,我发现这些并没有终止,而是一直持续到下一个收益声明。因此,我确保我的计数器将手动复位之前,每一个产量。然而,我的算法的生成器版本在某些点上仍然产生不同的结果,就像“非生成器函数”中的相同算法一样

有人能解释一下为什么这两个函数返回/产生不同的结果吗


Tags: or函数in算法numberforreturnif
1条回答
网友
1楼 · 发布于 2024-09-25 08:41:30

我不确定我是否理解您的问题,但下面是我如何将函数转换为生成器—基本上只需将return替换为yield语句即可:

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

相关问题 更多 >