python之yield和Generator

首先咱们从一个小程序导入,各定一个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

 

参考:http://article.yeeyan.org/view/75219/422747blog

相关文章
相关标签/搜索