python-3.x - 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__())
解决方案
这正是生成器应该做的。.__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)
推荐阅读
- c# - 如何实现动态加载新产品的工厂模式(开闭原则)?
- ar.js - 基于位置的 ARJS 示例不断显示警报('无法检索 GPS 位置。信号不存在。')
- python - Scrapy 响应 url 与我在启动 url 上定义的不完全一样
- python - Dask Dataframe 中的 Groupby、Unstack 和 Plot
- javascript - 无法重现错误:没有“新”就无法调用类构造函数 DateTimeFormat
- python - 模型要么未安装,要么是抽象的 - Django、Python
- android - 如何使用okhttp创建数据流并写入android中的设备
- javascript - babel-jest : this.setDynamic 不是一个函数(迁移到 Jest 25)
- javascript - javascript中奇怪的字符串值
- django - 登录时 Django 用户丢失组(但不是权限)