首先咱们从一个小程序导入,各定一个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)
但若是咱们想给定一个数,而后列出比这个数大的全部素数呢?咱们可能这样写:app
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,所以与通常函数不一样的是,此时控制权并未交出。spa
for循环会隐式的调用next()函数,next()函数负责调用generator中的__next__()方法,此时generator负责返回一个值给任何调用next()的方法,利用yield将此值传回去,至关于return语句。code