如何用收益代替回报

2024-10-03 04:33:16 发布

您现在位置: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]

我想使用yield,而不是将每个数字附加到result变量:

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>

错误在哪里?你知道吗


Tags: 函数innumberforobjectdefrange数字
3条回答

当在函数内部使用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中使用生成器。快乐生成!你知道吗

yield指定函数返回生成器对象。它符合iterable接口,因此如果您想从中获得一个严格的列表,请显式地构建该列表:

result = list(forEachInRangeThisNumberLoopThreeTimes(number))

甚至

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

我想这就是你想要的:

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,则必须将函数视为iterable。你知道吗

相关问题 更多 >