Python产生一个带生成器的列表

时间:2014-11-19 11:48:23

标签: python python-2.7

我对“return”和“yield

的目的感到困惑
def countMoreThanOne():
    return (yy for yy in xrange(1,10,2))

def countMoreThanOne():
    yield (yy for yy in xrange(1,10,2))

上述功能有什么区别? 是否无法使用yield?

访问函数内部的内容

2 个答案:

答案 0 :(得分:3)

首先你return生成器

from itertools import chain
def countMoreThanOne():
    return (yy for yy in xrange(1,10,2))

print list(countMoreThanOne())

>>> 
[1, 3, 5, 7, 9]

在此期间,您正在产生一个生成器,以便generator

中的generator
def countMoreThanOne():
    yield (yy for yy in xrange(1,10,2))

print list(countMoreThanOne())
print list(chain.from_iterable(countMoreThanOne()))

 [<generator object <genexpr> at 0x7f0fd85c8f00>]
[1, 3, 5, 7, 9]

如果您使用list comprehension,则可以清楚地看到差异: -

首先: -

def countMoreThanOne():
    return [yy for yy in xrange(1,10,2)]
print countMoreThanOne()

>>> 
[1, 3, 5, 7, 9]

def countMoreThanOne1():
    yield [yy for yy in xrange(1,10,2)]
print countMoreThanOne1()

<generator object countMoreThanOne1 at 0x7fca33f70eb0>
>>>

答案 1 :(得分:0)

在阅读完其他评论后,我认为你应该写下这样的函数:

def countMoreThanOne():
    return xrange(1, 10, 2)


>>> print countMoreThanOne()
xrange(1, 11, 2)
>>> print list(countMoreThanOne())
[1, 3, 5, 7, 9]

甚至更好,有一点让它成为一个功能:

def oddNumbersLessThan(stop):
    return xrange(1, stop, 2)


>>> print list(oddNumbersLessThan(15))
[1, 3, 5, 7, 9, 11, 13]