温州做网站推广,h5框架做网站,公司移动端的网站模板下载,游戏源码下载参考链接#xff1a; 什么时候在Python中使用yield而不是return
python中的yield功能比较强大#xff0c;什么意思呢#xff1f;如果一个函数f内使用了yield关键词#xff0c;那么该函数就可以这样使用#xff1a;
for item in f(***): **** 也就是包含yield关键词的函…参考链接 什么时候在Python中使用yield而不是return
python中的yield功能比较强大什么意思呢如果一个函数f内使用了yield关键词那么该函数就可以这样使用
for item in f(***): **** 也就是包含yield关键词的函数可以在for循环中迭代说到迭代第一印象是包含很多个元素才可以迭代确实如此。举个更加详细的案例 需求
你需要产生一个按照特定规则增减的序列比如最简单的递增序列1,2,3…1000000第一印象是可以把产生号的序列放到list中使用的时候直接取值就好,但是这种做法有个致命的缺点即需要预先存储这些序列这会耗费大量的内存那么有没有更好的方法呢
这是yield出来拯救世界了
def getSeq(num): index 1; while indexnum: yield index index index1 调用方法
for i in getSeq(1000000): pass 上述代码运行时for中调用了getSeq执行该函数时遇到yield index时会将index的值返回并且函数暂停在yield语句的位置下次再调用getSequence时将继续从上次暂停的位置开始运行直到遇到yield关键词时又将index的值返回一直这样循环
yield的作用也就是当执行到yield关键词的代码时函数会暂时返回下次调用该函数时会从上次暂停的地方继续运行yield起到一个暂时返回的作用有点像return。
另外yield其实可以有返回值也可以从外界改变yield的返回值
def getSeq(num): index 1 while indexnum: res yield index print(res str(res)\n) index index1
for i in getSeq(3): print(i str(i)\n) 输出 i1 res None i 2 res None 上面打印出的res取值都是Noneyield将index的值返回给调用方后res赋的值为None但是我们也可以从外界手动给res赋值
def getSeq(num): index 1 while indexnum: res yield index print(res str(res)\n) index index1
seq getSeq(5)#
next(seq)
seq.send(1)
seq.send(2)
seq.send(3) 输出 res1 res2 res3 上述代码先调用next(seq)主要是使getSeq函数暂停到yield语句的地方暂停在yield语句后才能使用send方法给yield返回值赋值否则会报错。
上述大概是yield关键词的使用总结
在执行seq getSeq(5)的时候函数并没有执行此时seq的类型是对象更具体一点seq是生成器类型generator每个generator类型对象主要有两个方法send和nextnext用来迭代send用来给yield返回值赋值默认情况下yield的返回值是None每一个send方法中隐式调用了next方法send方法是给yield表达式返回值赋值所以函数必须暂停在yield代码处的时候才能调用send方法其实就是调用send方法前至少调用一次next方法for i in getSeq 其实就是对generator进行迭代和next方法类似 扫描下方二维码及时获取更多互联网求职面经、java、python、爬虫、大数据等技术和海量资料分享公众号后台回复“csdn”即可免费领取【csdn】和【百度文库】下载服务公众号后台回复“资料”:即可领取5T精品学习资料、java面试考点和java面经总结以及几十个java、大数据项目资料很全你想找的几乎都有