下面的代码遍历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>
错误在哪里?
答案 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中使用生成器。快乐生成!