首页 > 解决方案 > Python生成器只返回yield的第一个实例

问题描述

当调用 'next' 时,此代码应按顺序生成所有素数,但它只生成 2,即列表的第一个素数。该列表可以正常生成素数。

def genPrime():
    x = 1
    primeList = [2]
    while True:
        x += 1
        tempList = []
        for i in range(len(primeList)):
            tempList.append(x % primeList[i])
        if min(tempList) > 0:
            next = primeList[-1]
            yield next
            primeList.append(x)

prime = genPrime()
print(prime.__next__())

标签: python-3.xlistgeneratoryield

解决方案


这正是生成器应该做的。.__next__()正如名字所说,只返回下一个项目。

尝试:

print(prime.__next__())
print(prime.__next__())
print(prime.__next__())

你会看到你一一得到它们。

此外,重要的.__next__()是不意味着直接调用。正确的方法是:

print(next(prime))
print(next(prime))
print(next(prime))

如果您想要所有这些,请执行以下操作:

for p in prime:
    print(p)

此外,虽然不是答案的一部分,但我给你一些编程技巧:

for i in range(len(primeList)):
    tempList.append(x % primeList[i])

有一个不必要的间接性。做就是了

for prime in primeList:
    tempList.append(x % prime)

此外,整个tempList是不必要的。只需使用一个for-else构造:

def genPrime():
    x = 1
    primeList = []
    while True:
        x += 1
        for prime in primeList:
            if x % prime == 0:
                break
        else:
            yield x
            primeList.append(x)

推荐阅读