zoukankan      html  css  js  c++  java
  • Python3-生成器

        生成器(generator)其实是一类特殊的迭代器。前面博客我们每次迭代获取数据(通过next()方法)时按照特定的规律进行生成。但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成下一个数据。为了达到记录当前状态,并配合next()函数进行迭代使用,python就搞了个生成器。所以说生成器(generator)其实是一类特殊的迭代器。
     
    一、创建方法:
            1.只要把一个列表生成式的 [ ] 改成 ( )
            2.使用yield函数创建生成器
     
        ① 创建生成器:形式-->  generator1 = (i for i in range(10))
           示例:
    1 generator_1 = (i for i in range(10)) # 这是一个生成器对象
    2  
    3 print(type(generator_1)) # <class 'generator'>
    4 print(generator_1) # 注意,打印生成器,不会像列表一样打印他的值,而是地址。
        ② 使用yield函数创建生成器
              generator非常强大。如果推算的算法比较复杂,用类似列表生成式的 for 循环无法实现的时候,还可以用函数来实现。简单来说:只要在def中有yield关键字的 就称为 生成器
     1 #著名的斐波拉契数列(Fibonacci):除第一个和第二个数外,任意一个数都可由前两个数相加得到
     2 #1.举例:1, 1, 2, 3, 5, 8, 13, 21, 34, ...使用函数实现打印数列的任意前n项。
     3  
     4 def fib(nums):
     5     a = 0
     6     b = 1
     7     for i in range(nums):
     8         a,b = b,a+b
     9         print(b)
    10  
    11     return "---结果如上所示---"
    12  
    13 fib(6)
     1 #2.将print(b)换成yield b,则函数会变成generator生成器。
     2 #yield b功能是:每次执行到有yield的时候,会返回yield后面b的值给函数并且函数会暂停,直到下次调用或迭代终止;
     3 def fib(nums):
     4     a = 0
     5     b = 1
     6     for i in range(nums):
     7         yield b
     8         a,b = b,a+b
     9  
    10     return "---结果如上所示---"
    11  
    12 print(fib(6)) # <generator object fib at 0x000001D43B9363C0>
     
    二、获取生成器的内容:
            方法一:使用for循环进行遍历
            方法二:命令行使用next()函数:调用next(G),就计算出下一个元素的值,直至结束,没有更多元素时,抛出StopIteration的异常
            方法三:使用对象自带的__next__()方法,效果等同于next(G)函数
     1 """
     2 方法一:使用for循环进行遍历
     3 方法二:命令行使用next()函数:调用next(G),就计算出下一个元素的值,
     4 直至结束,没有更多元素时,抛出StopIteration的异常
     5 方法三:使用对象自带的__next__()方法,效果等同于next(G)函数
     6 """
     7  
     8 generator_1 = (x for x in range(6,0,-1))
     9  
    10 # 方式一:使用for循环进行遍历
    11 for i in generator_1:
    12     print(i)
    13 # 6 5 4 3 2 1
    14  
    15 # 方式二:next()
    16 generator_1 = (x for x in range(6,0,-1))
    17 while True:
    18     try:
    19         x = next(generator_1)
    20         print('----->',x)
    21     except:
    22         print("---结果如上所示---")
    23         break
    24 """
    25 -----> 6
    26 -----> 5
    27 -----> 4
    28 -----> 3
    29 -----> 2
    30 -----> 1
    31 ---结果如上所示---
    32 """
    33  
    34 # 方式三:__next()__
    35 generator_1 = (x for x in range(6,0,-1))
    36 while True:
    37     try:
    38         x = generator_1.__next__()
    39         print('-----》',x)
    40     except:
    41         print("---结果如上所示---")
    42         break
    43 """
    44 -----》 6
    45 -----》 5
    46 -----》 4
    47 -----》 3
    48 -----》 2
    49 -----》 1
    50 ---结果如上所示---
    51 """
    52  
     
    生成器使用总结:
    1.生成器的好处是可以一边循环一边进行计算,不用一下子就生成一个很大的集合,占用内存空间。生成器的使用节省内存空间。
    2.生成器保存的是算法,而列表保存的计算后的内容,所以同样内容的话生成器占用内存小,而列表占用内存大。每次调用 next(G) ,就计算出 G 的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的异常。
    3.使用for 循环来遍历生成器内容,因为生成器也是可迭代对象。通过 for 循环来迭代它,不需要关心 StopIteration 异常。但是用for循环调用generator时,得不到generator的return语句的返回值。如果想要拿到返回值,必须用next()方法,且捕获StopIteration错误,返回值包含在StopIteration的value中。
    4.在 Python 中,使用了 yield 的函数都可被称为生成器(generator)。生成器是一个返回迭代器的函数,只能用于迭代操作。更简单点理解生成器就是一个迭代器。
    5.一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,保存当前所有的运行信息,并返回一个迭代值,下次执行next() 方法时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造中的位置。
     
     
  • 相关阅读:
    CDH 2、Cloudera Manager的安装
    204 01 Android 零基础入门 03 Java常用工具类 04 Java集合 04 Map集合 01 Map概述
    203 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 07 删除宠物猫信息数据(引入泛型知识点)
    202 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 06 查找宠物猫信息数据
    201 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 05 添加重复的宠物猫信息数据
    200 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 04 添加和显式宠物猫信息
    199 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 03 宠物猫信息管理概述
    198 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 02 案例:在集合中插入字符串
    197 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 01 Set概述
    196 01 Android 零基础入门 03 Java常用工具类 04 Java集合 02 List集合 05 案例:公告的删除和修改
  • 原文地址:https://www.cnblogs.com/DemonKnifeGirl/p/12997365.html
Copyright © 2011-2022 走看看