python生成器中的next()方法工作异常
这是一个“八皇后”的解决方案,效果很好。但是当我做了一点改变时,python生成器中的next()方法变得很奇怪python生成器中的next()方法工作异常,python,generator,Python,Generator,这是一个“八皇后”的解决方案,效果很好。但是当我做了一点改变时,python生成器中的next()方法变得很奇怪 def conflict(state, nextX): nextY = len(state) for i in range(nextY): if abs(state[i]-nextX) in (0, nextY-i): return True return False def queens(num=8, state=(
def conflict(state, nextX):
nextY = len(state)
for i in range(nextY):
if abs(state[i]-nextX) in (0, nextY-i):
return True
return False
def queens(num=8, state=()):
for pos in range(num):
if not conflict(state, pos):
if len(state) == num-1:
yield (pos,)
else:
results=queens(num, state + (pos,))
for res in results:
yield (pos,) + res
print list(queens(8))
只是打印一个[]。我真尴尬!我不明白为什么next()方法在其他任何情况下都能工作,但在这里却不行。您希望发生什么 在生成器上调用
next
时,它会使生成器前进并返回下一项。基本情况(len(state)==num-1
)只产生一个项目,因此在这种情况下,它将推进迭代器,接收StopIteration
,并终止循环,因此不会返回任何结果
根本问题是,您试图在循环遍历迭代器时推进迭代器;这不太可能奏效。但为什么没有像此回溯(最近一次调用是最后一次):文件“C:\Users\Administrator\Desktop\1.py”,第6行,在a.next()中StopIteration@unkonwn_kid
StopIteration
被results循环中的for res捕获,或者最终由list
构造函数执行。为什么它能自动捕获异常?那么为什么要回溯(最近一次调用):文件“C:\Users\Administrator\Desktop\1.py”,第6行,在a.next()StopIteration可以在另一个“for”loopdef foo()中引发:对于范围(3)中的i:yield i a=foo()对于a:print res print a.next()中的res,但为什么这有一个带有回溯的回溯(最近一次调用):文件“C:\Users\Administrator\Desktop\1.py”,在print a.next()中的第9行。停止迭代,因为它没有被for
循环或list
(等)构造函数捕获StopIteration
仅在in
表达式中的内抛出时,才会被for
循环捕获。
def conflict(state, nextX):
nextY = len(state)
for i in range(nextY):
if abs(state[i]-nextX) in (0, nextY-i):
return True
return False
def queens(num=8, state=()):
for pos in range(num):
if not conflict(state, pos):
if len(state) == num-1:
yield (pos,)
else:
results=queens(num, state + (pos,))
for res in results:
yield (pos,) +results.next() //here is the change. res -->results.next()
print list(queens(8))