时间:2021-05-22
阅读别人的python源码时碰到了这个yield这个关键字,各种搜索终于搞懂了,在此做一下总结:
代码示例1:
#encoding:UTF-8 def yield_test(n): for i in range(n): yield call(i) print("i=",i) #做一些其它的事情 print("do something.") print("end.") def call(i): return i*2 #使用for循环 for i in yield_test(5): print(i,",")结果是:
>>>
0 ,
i= 0
2 ,
i= 1
4 ,
i= 2
6 ,
i= 3
8 ,
i= 4
do something.
end.
>>>
理解的关键在于:下次迭代时,代码从yield的下一跳语句开始执行。
代码示例2:
def node._get_child_candidates(self, distance, min_dist, max_dist): if self._leftchild and distance - max_dist < self._median: yield self._leftchild if self._rightchild and distance + max_dist >= self._median: yield self._rightchild与前面不同的是,这个函数中没有for循环,但它依然可以用于迭代。
node._get_child_candidates函数中有yield,所以它变成了一个迭代器,可以用于迭代。
执行第一次迭代时(其实就是调用next()方法),如果有左节点并且距离满足要求,会执行第一个yield,这时会返回self._leftchild并完成第一个迭代。
执行第二次迭代时,从第一个yield后面开始,如果有右节点并且距离满足要求,会执行第二个yield,这时会返回self._rightchild并完成第一个迭代。
执行第三次迭代时,第二个yield后再无代码,捕获异常,退出迭代。
调用过程:
result, candidates = list(), [self]while candidates: node = candidates.pop() distance = node._get_dist(obj) if distance <= max_dist and distance >= min_dist: result.extend(node._values) candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))return result上面的node._get_child_candidates(self, distance, min_dist, max_dist)是放在extend()函数中作为参数的,为什么可以这么用,就因为extend函数的参数不仅仅支持array,只要它是一个迭代器就可以。它的原型是array.extend(iterable)。
代码示例3:
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、Python函数中的参数1、使用python的函数时,有参数类别,比如位置参数、关键字参数、可变长参数2、位置参数、关键字参数很好理解,关键是可变长参数经常
前言用过c#的可能对yield关键字爱不释手,那么在像我这种被迫上java贼船的人,就想找到类似的功能。关于c#中的yield关键字大家可以参考这篇文章:我使用
前言从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数。yield在协程中的用法:在协程中yield通常出现在表达式的右边,例如:datum
从句法上看,协程与生成器类似,都是定义体中包含yield关键字的函数。可是,在协程中,yield通常出现在表达式的右边(例如,datum=yield),可以产出
从句法上看,协程与生成器类似,都是定义体中包含yield关键字的函数。可是,在协程中,yield通常出现在表达式的右边(例如,datum=yield),可以产出