我正在尝试构建电源设置功能。 当我将其构建为生成器时,它可以正常工作。
但我想把它写成常规功能
def power_set(group):
if len(group)==0:
return set()
else:
last=group.pop()
for sub in power_set(group):
return (sub|{last})
return (sub)
任何人都知道问题可能是什么?
答案 0 :(得分:1)
您尝试通过将所有yield
简单地更改为return
来将生成器转换为函数。这几乎永远不会奏效,因为它完全改变了流程。产量后,生成器函数将继续,但返回将永久返回。
在您的情况下,首先将大型集合传递到power_set()
函数。它会愉快地递归,每次减少一件物品,直到它击中一件物品。此时,pop()
语句将删除最后一项,然后它将以空集作为输入调用power_set()
。这将立即作为空集返回,导致for循环评估为:
for sub in set():
由于它是空的,它将跳过for
循环(两个return
s)的主体并到达函数的末尾,因此根据定义返回None
。这会导致递归堆栈再展开一个级别并尝试执行:
for sub in None:
这就是您获得例外的原因。
要修复它,您不能一次返回一个值,但必须一次性返回power_set()
特定调用的所有值。
def power_set(group):
if len(group)==0:
return [set()]
else:
last=group.pop()
s = []
for sub in power_set(group):
s.append(sub|{last})
s.append(sub)
return s
答案 1 :(得分:0)
您可以懒惰,只需创建一个包含生成器版本
生成的所有项目的列表powSet = list( power_set_generator(group) )
假设power_set_generator()
是您的生成器版本,可以正常工作。