Python函数中有一个生成器;如何返回修改后的列表?

2024-10-01 13:44:53 发布

您现在位置:Python中文网/ 问答频道 /正文

一点背景:我一直在尝试编写一个“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,但没有发现任何问题。你知道吗

任何提示或建议都将受到欢迎。你知道吗


Tags: 函数代码infalsetrue内容forindex
1条回答
网友
1楼 · 发布于 2024-10-01 13:44:53

这与enumerate无关,您试图在生成器中返回在python3.3之前是非法的,并且from 3.3+ it means something entirely different.

如果您可以在不需要返回列表的情况下使用它,我建议您将函数保留为生成器,如果您希望返回列表结果,则只需调用list()返回值:

primes = list(SieveErat(150000)) #this replaces loop with .append

但是要理解出了什么问题,如果函数中仍然有yield语句,那么它必须返回一个生成器对象,如果不希望它返回一个生成器对象,那么将yield语句一起删除:

def SieveErat(n):
    numbers = [False]*2+[True]*(n-1)

    for index, prime_candidate in enumerate(numbers):
        if prime_candidate == True:
            #yield index #no yield statement if you want to return the numbers list
            for x in xrange(index*index, n, index):
                numbers[x] = False

    return numbers #return at end

然而,这将返回一个TrueFalse的列表,而不是真正的数字,您可以在每次执行yield操作时保留一个包含所有素数和.append的单独列表:

def SieveErat(n):
    numbers = [False]*2+[True]*(n-1)
    result = [] #start with no results
    for index, prime_candidate in enumerate(numbers):
        if prime_candidate == True:
            results.append(index) #instead of yield index
            for x in xrange(index*index, n, index):
                numbers[x] = False
    return results

但这感觉像是从生成器向后退了一步,我个人只会保留您发布的内容,并将结果转换为list。你知道吗

相关问题 更多 >