小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。
废话不多说,开始今天的题目:
问:说说Python中yield的用法?
答:Python中有一个非常有用的语法叫做生成器,用到的关键字就是yield。yield的作用是把一个函数变成生成器(generator),起到一个延迟的作用,在需要的时候产生结果,这样可以有效地节约系统资源,避免不必要的内存占用。
可以先把yield看做return,就是在程序中返回某个值,返回之后程序就不再往下运行。看下面代码,程序开始执行以后,因为getNum函数中有yield关键字,所以getNum函数并不会真的执行,而是先得到一个生成器。直到调用next方法,getNum函数正式开始执行,先执行getNum函数中的print方法,然后进入while循环 。
def getNum(n): print("执行程序") i = 0 ; while i <= n: # return i yield i i += 1; # print(getNum(5)) a = getNum(5) print(next(a)) print(next(a)) 输出结果: 执行程序 0 1
可以看出yield和return的区别:带yield的函数是一个生成器,而不是一个函数了,这个生成器有一个函数就是next函数,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的,所以调用next的时候,生成器并不会把函数重新执行,只是接着上一步停止的地方开始 。
再来看一个生成器send函数的例子。看下面代码,为什么执行结果有个None值?这里给大家留个小问题,大家可以自己思考下,然后在评论区留言谈论,这个也是小知识点哦 。
def getNum(n): print("执行程序") i = 0 ; while i <= n: temp = yield i print(temp) i += 1; a = getNum(5) print(next(a)) print(a.send("程序IT圈")) print(next(a)) 输出结果:---- 执行程序 0 程序IT圈 1 None 2
再给大家推荐个yield博客链接:
https://blog.csdn.net/mieleizhi0522/article/details/82142856
如果对于参考答案有不认同的,大家可以在评论区指出和补充,欢迎留言!