当前位置:   article > 正文

python知识点简明介绍:关键字yield的作用_python yield的作用

python yield的作用


前言

迭代器: 根据我的理解,迭代操作是一个可重复的过程,在每次迭代时会得到一个结果。例如,我们对数组 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
  • 2
  • 3
  • 4
  • 5

该函数会返回如下结果

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=" ")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在该实现中,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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

得到如下结果:
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 已经没有数可以迭代了

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

总结

yield 相当于特殊的print:
在函数体内执行到print语句时,程序输出一个数,然后接着执行下面的程序。
在函数体内执行到yield语句时,程序会返回给调用方一个数(不跳出函数),该函数仍未执行结束,在需要时会接着执行函数体直到yield返回下一个数,当函数体内的代码完全执行结束后,才会跳出函数。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号