生成器中yield和next()的用法解析

生成器概念:

python使用生成器对延迟操作提供了支持,就是需要的时候才产生结果,而不是产生结果.

  • 生成器函数:

    和其他函数编写方式相同,使用yield语句一次返回一次结果,在每个结果之间挂起当前状态,下次调用直接继续当前的状态.

  • 生成器表达式:

    类似于列表解析,不同的是他返回的是一个迭代对象而不是一个列表.

#列表生成器:
L = [x for x in range(5)]
print(L)
#简单生成器:
G= (x for x in range(5))
print(next(G))
print(next(G))
print(next(G))
print(next(G))
print(next(G))
当我们输出结果是一个一个的输出时:
  • 1.创建一个迭代器类,把代码写进去,用类来创建可迭代对象,然后用next()函数来把结果迭代出来.
    class test_Iterator():
        def __init__(self):
            self.a=0
            self.b=1
        def __iter__(self):
            return self
        def __next__(self):
            num = self.a
            self.a,self.b=self.b,self.b+self.a
            return num
    
    itera = test_Iterator()
    print(next(itera))
    print(next(itera))
    print(next(itera))
    print(next(itera))
    print(next(itera))
    print(next(itera))
    ########################################################
    0
    1
    1
    2
    3
    5      
  • 2.代码函数的合适位置加上yield,这时候这个函数就变成一个生成器了
    def test():
        a = 1
        b = 2
        while True:
            yield a
            a,b = b,a*b
    
    generator = test()
    
    print(next(generator))
    print(next(generator))
    print(next(generator))
    print(next(generator))
    print(next(generator))
    print(next(generator))
    print(next(generator))
    print(next(generator))
    #######################################
    1
    2
    2
    4
    8
    32
    256
    8192
    第一次用next()唤醒生成器时,从函数的开头开始运行,遇到yield a,返回a,然后暂停函数,并记住函数是运行到这个位置的。
    
    第二次唤醒生成器,从yield a断点处开始,然后a,b开始赋值,while True循环又遇见yield a,返回a,然后暂停函数,并记住函数是运行到这个位置的
  • 3.生成器yield接收参数,send()方法:
    #b = yield,会把yield接收的值赋值给b。
    def test():
        a = 1
        while True:
            recv = yield a
            print('接收值:',recv)
    
    gen = test()
    
    print(next(gen))
    print(gen.send('Jhonsenry'))
    print(gen.send('a bad guy'))
    ##############################################################################
    1
    接收值: Jhonsenry
    1
    接收值: a bad guy
    1

原文地址:https://www.cnblogs.com/Zhao159461/p/11416490.html

时间: 2024-10-29 09:19:23

生成器中yield和next()的用法解析的相关文章

python生成器中yield和send分析

生成器 在python中生成器是指用代码实现迭代器的的功能本质还是迭代器,只不过是代码实现迭代器功能.在python中生成器是由函数实现的,通常我们在函数中加入yeild就可以实现生成器. 生成器中yield #定义一个函数 def func(): print(111) yield 3 print(222) g=func() 运行上面代码你会发现函数根本没有执行,因为此时g是一个生成器对象,生成器是不会自己运行的,需要你调用next方法才会运行,并且每次遇到yield就会停止,继续调用next方

sql中group by 和having 用法解析

--sql中的group by 用法解析:-- Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.--它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理.--注意:group by 是先排序后分组:--举例子说明:如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术select DepartmentID as '部门名称',COUNT(*) a

python中yield与return的用法与区别

生成器:函数内带有yield关键字,那么,这个函数执行的结果就是生成器. 生成器,本质就是迭代器. return与,yield 1,return只能返回一次函数就彻底结束了.而yield能返回多次值. 2,yield把函数变成生成器---迭代器--->把iter,next方法给到函数了.为我们自己定义迭代器,提供了方便. 3,yield能保存函数在暂停,和继续下一次云形时的状态. 原文地址:https://www.cnblogs.com/catherine007/p/8309474.html

python中if __name__ == "__main__":用法解析

想必很多初次接触python的同学都会见到这样一个语句,if __name__ == "__main__": 1. python文件的后缀为.py: 2. .py文件既可以用来直接执行,就像一个小程序一样,也可以用来作为模块被导入(比如360安全卫士,就是依靠一个个功能模块来实现的,好比360安全卫士本身框架是一个桌面,而上面的图标就是快捷方式,这些快捷方式所指向的就是这一个个功能模块) 3. 在python中导入模块一般使用的是import 好了,在确定知道以上几点之后,就可以开始解

python中yield的用法及生成器的理解

首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受. 接下来是正题: 首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了.看做return之后再把它看做一个是

sql中的group by 和 having 用法解析

--sql中的group by 用法解析:-- Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.--它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理.--注意:group by 是先排序后分组:--举例子说明:如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术select DepartmentID as '部门名称',COUNT(*) a

C#中yield return用法分析(转载自shichen2014)

本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解.具体如下: yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历. 有这样的一个int类型的集合: ? 1 2 3 4 static List<int> GetInitialData() {   return new List<int>(){

C#中yield return用法分析

这篇文章主要介绍了C#中yield return用法,对比使用yield return与不使用yield return的流程,更直观的分析了yield return的用法,需要的朋友可以参考下. 本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解.具体如下: yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历. 有

转载 sql中的group by 和 having 用法解析

sql中的group by 和 having 用法解析 --sql中的group by 用法解析:-- Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.--它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理.--注意:group by 是先排序后分组:--举例子说明:如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术select Depar