视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
python之yield和Generator分析
2020-11-27 14:25:50 责编:小采
文档


首先我们从一个小程序导入,各定一个list,找出其中的素数,我们会这样写

import math
def is_Prims(number):

 if number == 2:
 return True
 //除2以外的所有偶数都不是素数
 elif number % 2 == 0:
 return False
 //如果一个数能被除1和本身之外的数整除,则为合数。其实我们的判定范围到根号n就可以
 for cur in range(2,int(math.sqrt(number))+1,2):
 if number % cur == 0:
 return False
 else:
 return True

def get_Prims(input_list):

 result_list = list()
 for element in input_list:
 if is_Prims(element):
 result_list.append(element)
 return result_list

aa = get_Prims([1,2,3,4,5,6,7,8,9])
print (aa)

但如果我们想给定一个数,然后列出比这个数大的所有素数呢?我们可能这样写:

def get_Prims(number): 
if is_Prims(number): 
return number

但是一旦return函数将控制权交给调用者后彻底结束,任何局部变量和函数工作都被丢弃,下一次调用又会从头开始。因此我们就可以用一下写法:

def get_Prims(number):
 while(True):
 if is_Prims(number):
 yield number
 number += 1

def get_numbers():
 total = list()
 for next_prim in get_Prims(2):
 if next_prim < 100:
 total.append(next_prim)
 else:
 print(total)
 return

get_numbers()

下面解释一下generator函数,一个函数的def代码里包含了yield,函数就自动成为了一个generator函数(及时仍包含有return),generator函数创建generator(一种特殊形式的迭代器,这个迭代器有一个内置__next__()方法),当需要一个值的时候通过yield来产生而不是直接return,因此与一般函数不同的是,此时控制权并未交出。

for循环会隐式的调用next()函数,next()函数负责调用generator中的__next__()方法,此时generator负责返回一个值给任何调用next()的方法,利用yield将此值传回去,相当于return语句。

更多python之yield和Generator分析相关文章请关注PHP中文网!

下载本文
显示全文
专题