zoukankan      html  css  js  c++  java
  • 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)

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

    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语句。

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

  • 相关阅读:
    Java编译器API简介
    liblinear和libsvm区别
    spark和hadoop比较
    maxout激活函数
    FTRL算法
    NLP里面好的学习资料
    阿里妈妈MLR模型(论文)
    FM的推导原理--推荐系统
    GBDT+LR simple例子
    深度学习最全优化方法---来源于知乎
  • 原文地址:https://www.cnblogs.com/guoxueyuan/p/6514774.html
Copyright © 2011-2022 走看看