如何使用收益而不是收益

时间:2017-09-14 20:54:35

标签: python

下面的代码遍历1到5之间的数字,调用forEachInRangeThisNumberLoopThreeTimes函数传递一个数字。该函数接受一个数字并将其循环三次,每次迭代附加到它最后返回的numbers列表。

def forEachInRangeThisNumberLoopThreeTimes(number):
    numbers = []
    for each in range(number):
        for i in range(3):
            numbers.append(i)
    return numbers


result = []
for number in range(1, 5):
    print number, forEachInRangeThisNumberLoopThreeTimes(number)

打印哪些:

1 [0, 1, 2]
2 [0, 1, 2, 0, 1, 2]
3 [0, 1, 2, 0, 1, 2, 0, 1, 2]
4 [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]

我没有将每个数字附加到result变量,而是使用yield

def forEachInRangeThisNumberLoopThreeTimes(number):
    for each in range(number):
        for i in range(3):
            yield i

现在我执行:

for number in range(1, 5):
    result = forEachInRangeThisNumberLoopThreeTimes(number)

result不是我所期望的:

1 <generator object forEachInRangeThisNumberLoopThreeTimes at 0x104ebfaf0>
2 <generator object forEachInRangeThisNumberLoopThreeTimes at 0x104ebfaf0>
3 <generator object forEachInRangeThisNumberLoopThreeTimes at 0x104ebfaf0>
4 <generator object forEachInRangeThisNumberLoopThreeTimes at 0x104ebfaf0>

错误在哪里?

3 个答案:

答案 0 :(得分:4)

yield表示函数返回生成器对象。它符合iterable接口,因此如果您需要一个严格的列表,请明确构建列表:

result = list(forEachInRangeThisNumberLoopThreeTimes(number))

甚至

result = [x for x in forEachInRangeThisNumberLoopThreeTimes(number)]

答案 1 :(得分:2)

我认为这就是你要找的东西:

def forEachInRangeThisNumberLoopThreeTimes(number):
    for each in range(number):
        for i in range(3):
            yield i
result = []
for num in forEachInRangeThisNumberLoopThreeTimes(5):
    result.append(num)

result = list(forEachInRangeThisNumberLoopThreeTimes(number))

如果您使用yield,则必须将您的函数视为可迭代的。

答案 2 :(得分:0)

在函数内部使用yield时,它会成为生成器,这就是获得这些输出的原因。

我将使用一个更简单的示例来解释如何正确使用生成器。 我们假设我们有以下生成器:

def example_generator():
    yield 1
    yield 2 
    yield 3

现在,当我致电x = example_generator()时,x将保留生成器,而不是值1.

如果我想获得值1,我必须

x = example_generator()
first_val = next(example_generator())

现在first_val的值为1,再次调用next(),您将获得值2.当生成器耗尽时,您将获得StopIteration例外

要避免StopIteration你可以

for value in example_generator():
    print(value)

在这种情况下,您将获得

1
2
3

并且for循环将为您处理StopIteration

如果您正在寻找list,那么您基本上会失去使用发电机的优势,但可以通过

完成
list(example_generator())

我希望这是一个明确的解释,所以你可以自己了解如何在python中使用生成器。快乐生成!