下面的代码遍历介于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>
错误在哪里?你知道吗
当在函数内部使用
yield
时,它就变成了一个生成器,这就是为什么要得到这些输出。你知道吗我将用一个简单的例子来解释如何正确使用生成器。 假设我们有以下生成器:
现在,当我调用
x = example_generator()
时,x
将持有一个生成器而不是值1。你知道吗如果我想得到值1,我必须
现在
first_val
的值为1,再次调用next()
,将得到值2。当生成器耗尽时,将出现StopIteration
异常为了避免
StopIteration
,你可以在这种情况下你会得到
for循环将为您处理
StopIteration
。你知道吗如果你想把它作为一个
list
来使用,你基本上就失去了使用生成器的优势,但是可以通过我希望这是一个足够清晰的解释,这样您就可以自己理解如何在python中使用生成器。快乐生成!你知道吗
yield
指定函数返回生成器对象。它符合iterable
接口,因此如果您想从中获得一个严格的列表,请显式地构建该列表:甚至
我想这就是你想要的:
或者
如果使用
yield
,则必须将函数视为iterable。你知道吗相关问题 更多 >
编程相关推荐