一点背景:我一直在尝试编写一个“Eratosthenes筛”算法。应StackOverflow Python聊天室中一些优秀(而且非常有耐心)程序员的请求,我阅读了enumerate()
函数,并找到了一种方法将其合并到我的代码中(是的,我在这里是一个新手)。到目前为止,我的(可行;返回预期响应)代码如下所示:
def SieveErat(n):
numbers = [False]*2+[True]*(n-1)
for index, prime_candidate in enumerate(numbers):
if prime_candidate == True:
yield index
for x in xrange(index*index, n, index):
numbers[x] = False
primes = []
for x in SieveErat(150000):
primes.append(x)
print primes[10002]
不用说,enumerate()
函数使得编码比以前任何嵌套循环都简单得多。但是,我担心我不了解enumerate()
的某些内容,因为当我试图通过在函数中添加附加内容来缩短代码时,我不断遇到错误-即
File "SievErat.py", line 13
return numbers
SyntaxError: 'return' with argument inside generator
我还尝试将列表numbers
中的所有True
元素附加到初始化的列表primes
,但没有发现任何问题。你知道吗
任何提示或建议都将受到欢迎。你知道吗
这与
enumerate
无关,您试图在生成器中返回在python3.3之前是非法的,并且from 3.3+ it means something entirely different.如果您可以在不需要返回列表的情况下使用它,我建议您将函数保留为生成器,如果您希望返回列表结果,则只需调用
list()
返回值:但是要理解出了什么问题,如果函数中仍然有
yield
语句,那么它必须返回一个生成器对象,如果不希望它返回一个生成器对象,那么将yield
语句一起删除:然而,这将返回一个
True
和False
的列表,而不是真正的数字,您可以在每次执行yield
操作时保留一个包含所有素数和.append
的单独列表:但这感觉像是从生成器向后退了一步,我个人只会保留您发布的内容,并将结果转换为
list
。你知道吗相关问题 更多 >
编程相关推荐