【问题标题】:Python function returns generator instead of listPython函数返回生成器而不是列表
【发布时间】:2014-03-17 00:05:43
【问题描述】:

我想在 Python 中使用素数,因此使用一个函数来创建 Sieve of Eratosthenes

def primes(limit):
    a = [True] * limit
    a[0] = a[1] = False

    for (i, isprime) in enumerate(a):
        if isprime:
            yield i
            for n in range(i*i, limit, i):
                a[n] = False
    return list(a)

在我看来,这个函数肯定会返回一个列表,但是当我执行print(primes(1000)) 时,我只会得到<generator object primes at 0x0000000002C5C558> 作为输出。当使用print(list(primes(1000))) 时,一切都按预期工作(打印素数列表)。

我错过了什么?

为什么函数返回的是生成器而不是列表?

【问题讨论】:

  • 我建议将函数保留为生成器并仅在您确实确​​实需要列表时使用list()
  • 您正在使用 3.3 的一个新功能(并且可能有用)。早期版本不允许这样做。见here
  • 我在本地修改了我的代码以返回生成器。真是方便多了。

标签: python list python-3.x generator


【解决方案1】:

我刚刚遇到了类似的问题,想给大家更新一下。如果函数在某个时候产生了,即使您期望一个列表,它也会返回一个生成器。所以你需要摆脱收益率。

def get_list_or_generator(return_list=True):
    items = [1, 2, 3, 4]
    if return_list:
        return items  # returns generator
    else:
        for item in items:
            yield item  # returns generator

它可以与list(get_list_or_generator()) 一起使用,因为casting to list iterates through the generator

【讨论】:

    【解决方案2】:

    为了返回列表,您可以:

    def primes(limit):
        result = []         # Store primes here.
        a = [True] * limit
        a[0] = a[1] = False
    
        for (i, isprime) in enumerate(a):
            if isprime:
                result.appen(i)
                for n in range(i*i, limit, i):
                    a[n] = False
        return result      # return primes
    

    【讨论】:

      【解决方案3】:

      Martijn 打败了我。您在 return 语句之前点击了 yield 表达式。

      【讨论】:

        【解决方案4】:

        因为你在函数中使用了yield expression

        在筛子中,a 是一个掩码,而不是最终生成的素数列表。你真的不想返回那个列表。

        如果您希望函数返回一个列表而不是作为生成器,请在函数中收集素数:

        def primes(limit):
            a = [True] * limit
            a[0] = a[1] = False
            primes = []
        
            for (i, isprime) in enumerate(a):
                if isprime:
                    primes.append(i)
                    for n in range(i*i, limit, i):
                        a[n] = False
        
            return primes
        

        【讨论】:

        • 我是盲人... :( 不仅是盲人,而且还没有经验。
        • Holly cr...你在同一个问题上打败了我两次:D
        猜你喜欢
        • 2013-07-22
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多