2017-09-14 69 views
0

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

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> 

哪里错误?

回答

4

yield指定一个函数返回一个生成器对象。它符合iterable接口,所以如果你想从它严格的清单,明确建设名单:

result = list(forEachInRangeThisNumberLoopThreeTimes(number)) 

甚至

result = [x for x in forEachInRangeThisNumberLoopThreeTimes(number)] 
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,则必须将您的功能像iterable一样处理。

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中使用生成器。快乐生成!

相关问题