【发布时间】: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