Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python生成器中的next()方法工作异常_Python_Generator - Fatal编程技术网

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=(

这是一个“八皇后”的解决方案,效果很好。但是当我做了一点改变时,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=()):
    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))