赞
踩
迭代器: 根据我的理解,迭代操作是一个可重复的过程,在每次迭代时会得到一个结果。例如,我们对数组 a = [1, 2, 3, 4, 5] 进行迭代,那么总共可以迭代5次,每次按顺序返回数组中的一个元素。迭代器就是可执行迭代操作一个组件,经过它包装后的对象(如数组)便可以进行迭代。
yield: 据我所知,是python语言中有一个特有的关键字。该关键字通常写在一个函数中,其作用是将该函数变成一个迭代器。每次调用函数时执行到yield语句时就返回yield指向的数据,当下次继续调用该函数时则接着从yield下一句开始执行,直到再次执行yield语句返回数据。
上面的介绍有些枯燥,接下来我们通过一些代码示例向大家介绍yield的用法。
首先,我们编写一个普通函数,输出前 1-10 的平方。
def square_numbers(n):
x = 1
while x <= n:
print(x * x, end=" ")
x += 1
该函数会返回如下结果
1 4 9 16 25 36 49 64 81 100
我们将print函数替换为yield语句后,该函数会变成一个可迭代对象,可以通过for循环来访问每个平方数,可以实现相同的功能。
def square_numbers(n):
x = 1
while x <= n:
yield x * x
x += 1
it = square_numbers(10)
for number in it:
print(number, end=" ")
在该实现中,square_numbers(10)由一个函数转变为一个迭代器,并且赋给了it。然后我们想要依次遍历it中的内容。
it会被执行10次,这个10次是由函数中的while x<=n 条件决定的,每次需要一个数的时候,会执行square_numbers函数,在执行到yield x * x时便返回一个平方数赋给number。
在此时,yield相当于return的作用,不同的是,return执行一次后该函数就执行结束不会再执行了,而yield只是临时返回一个当前值后处于等待状态,当调用方需要下一个值时,yield会继续返回一个当前值,直到最后一个值被返回。
在square_numbers()中加一句print,查看该迭代器如何执行
def square_numbers(n):
x = 1
while x <= n:
print(x * x, 'in square_numbers')
yield x * x
x += 1
for number in square_numbers(10):
print(number)
得到如下结果:
1 in square_numbers
1
4 in square_numbers
4
9 in square_numbers
9
16 in square_numbers
16
25 in square_numbers
25
36 in square_numbers
36
49 in square_numbers
49
64 in square_numbers
64
81 in square_numbers
81
100 in square_numbers
100
可以看出,square_numbers像普通函数一样执行,不同的是会通过yield向调用方返回数据
也可以通过next()函数来依次获取迭代器的每个值
print(next(it)) # 1 print(next(it)) # 4 print(next(it)) # 9 print(next(it)) # 16 print(next(it)) # 25 print(next(it)) # 36 print(next(it)) # 49 print(next(it)) # 64 print(next(it)) # 81 print(next(it)) # 100 print(next(it)) # StopIteration 已经没有数可以迭代了
yield 相当于特殊的print:
在函数体内执行到print语句时,程序输出一个数,然后接着执行下面的程序。
在函数体内执行到yield语句时,程序会返回给调用方一个数(不跳出函数),该函数仍未执行结束,在需要时会接着执行函数体直到yield返回下一个数,当函数体内的代码完全执行结束后,才会跳出函数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。